टेम्प्लेट फ़ाइल में परिवर्तन होने पर फ्लास्क एप्लिकेशन को पुनः लोड करें


95

डिफ़ॉल्ट रूप से, जब अंतर्निहित सर्वर ( Flask.run) का उपयोग करके फ्लास्क एप्लिकेशन को चलाया जाता है, तो यह अपनी पायथन फ़ाइलों की निगरानी करता है और यदि कोड बदलता है तो स्वचालित रूप से ऐप को फिर से लोड करता है:

* Detected change in '/home/xion/hello-world/app.py', reloading
* Restarting with reloader

दुर्भाग्य से, यह केवल .py फ़ाइलों के लिए काम करने लगता है , और मुझे इस कार्यक्षमता को अन्य फ़ाइलों तक विस्तारित करने का कोई तरीका नहीं मिल रहा है। खासतौर पर, टेम्प्लेट में बदलाव होने पर फ्लास्क को फिर से शुरू करना बेहद उपयोगी होगा । मैंने इस बात पर भरोसा किया है कि मैं कितनी बार टेम्प्लेट में मार्कअप कर रहा था और किसी भी बदलाव को नहीं देखकर भ्रमित हो रहा था, केवल यह पता लगाने के लिए कि ऐप अभी भी जिन्जा टेम्पलेट के पुराने संस्करण का उपयोग कर रहा था।

तो, क्या फ्लास्क मॉनिटर फाइल को टेम्प्लेट डायरेक्टरी में रखने का एक तरीका है , या क्या इसे फ्रेमवर्क के स्रोत में डाइविंग की आवश्यकता है?

संपादित करें : मैं Ubuntu 10.10 का उपयोग कर रहा हूं। वास्तव में किसी भी अन्य प्लेटफार्मों पर कोशिश नहीं की है।


आगे की पूछताछ के बाद, मुझे पता चला है कि वास्तव में ऐप को फिर से लोड किए बिना, टेम्प्लेट में परिवर्तन वास्तव में अपडेट किए जाते हैं । हालाँकि, यह केवल उन टेम्प्लेट पर लागू होता है जो पास किए गए हैं flask.render_template

लेकिन ऐसा होता है कि मेरे ऐप में, मेरे पास काफी पुन: प्रयोज्य, पैरामीट्रिज्ड घटक हैं जो मैं जिनजा टेम्प्लेट में उपयोग करता हूं। उन्हें {% macro %}एस के रूप में लागू किया जाता है , समर्पित "मॉड्यूल" में रहते हैं और {% import %}वास्तविक पृष्ठों में एड होते हैं । सभी अच्छे और DRY ... सिवाय इसके कि उन आयातित टेम्पलेट्स को स्पष्ट रूप से संशोधनों के लिए कभी नहीं जांचा जाता है, क्योंकि वे बिल्कुल भी नहीं गुजरते हैं render_template

(उत्सुकता से, यह उन टेम्प्लेटों के लिए नहीं होता है , जो मेरे द्वारा उपयोग किए गए टेम्पलेट्स के लिए हैं {% extends %}{% include %}मेरे पास कोई विचार नहीं है क्योंकि मैं वास्तव में उनका उपयोग नहीं करता हूं।)

तो लपेटने के लिए, इस घटना की जड़ें जिंजा और फ्लास्क या वर्केज़ग के बीच कहीं झूठ लगती हैं। मुझे लगता है कि यह उन परियोजनाओं में से किसी के लिए बग ट्रैकर के लिए एक यात्रा वारंट कर सकता है :) इस बीच, मैंने जेड को स्वीकार कर लिया है क्योंकि मैं वास्तव में इस्तेमाल किया समाधान है - जवाब है और यह एक आकर्षण की तरह काम करता है।


3
सुनिश्चित करें कि एप्लिकेशन DEBUG = True के साथ कॉन्फ़िगर किया गया है, डॉक्स देखें ।
एलेक्स मोरेगा

जवाबों:


65

मेरे अनुभव में, टेम्प्लेट को रीफ़्रेश होने के लिए पुनः आरंभ करने की आवश्यकता नहीं होती है, क्योंकि उन्हें डिस्क से लोड किया जाना चाहिए render_template()जिसे हर बार कहा जाता है। हो सकता है कि आपके टेम्प्लेट का उपयोग अलग-अलग तरीके से किया जाए।

टेम्प्लेट (या कोई अन्य फ़ाइल) बदलने पर अपने एप्लिकेशन को पुनः लोड करने के लिए, आप extra_filesतर्क को पास कर सकते हैं Flask().run(), देखने के लिए फ़ाइल नाम का एक संग्रह: उन फ़ाइलों पर कोई भी परिवर्तन पुनः लोडर को ट्रिगर करेगा।

उदाहरण:

from os import path, walk

extra_dirs = ['directory/to/watch',]
extra_files = extra_dirs[:]
for extra_dir in extra_dirs:
    for dirname, dirs, files in walk(extra_dir):
        for filename in files:
            filename = path.join(dirname, filename)
            if path.isfile(filename):
                extra_files.append(filename)
app.run(extra_files=extra_files)

यहाँ देखें: http://werkzeug.pocoo.org/docs/0.10/serves/?highlight=run_simple#werkzeug.serves.run_simple


अच्छी चीज़! मैं मानता हूं कि मैं उस दस्तावेज के लिंक से चूक गया, Flask.runजिसके कारण वेर्केगॉग डॉक्स बना। लेकिन यह विशेष विकल्प काफी उपयोगी लगता है कम से कम इसका उल्लेख फ्लास्क डॉक्स में किया गया है।
Xion

अगर किसी को एक त्रुटि का सामना करना पड़ता है No such file or directory, जो कहता है , तो सापेक्ष पथ का उपयोग करने का प्रयास करें:extra_dirs = ['./directory/to/watch',]
केविन

3
यदि आप भी इस बारे में उलझन में हैं कि pathयह क्या है os.path। यह ध्यान देने योग्य था
bjesus

स्थैतिक फ़ाइलों को बदलने के बाद ऑटो-लोडिंग के लिए यह देखें ।
सिमानकेशी

1
flask runकमांड लाइन से चलने पर अतिरिक्त फ़ाइलों को निर्दिष्ट करने का कोई विचार ?
माइकल शेपर

143

आप उपयोग कर सकते हैं

TEMPLATES_AUTO_RELOAD = True

से http://flask.pocoo.org/docs/1.0/config/

क्या टेम्पलेट स्रोत के संशोधनों की जांच करना और इसे स्वचालित रूप से पुनः लोड करना है। डिफ़ॉल्ट रूप से मान कोई भी नहीं है जिसका अर्थ है कि फ्लास्क मूल फ़ाइल को केवल डिबग मोड में देखता है।


11
यह समाधान पारंपरिक, प्रलेखन द्वारा समर्थित, समझने में सरल और लागू करने में आसान है। इसे स्वीकार किया जाना चाहिए!
कैरोलिन कॉनवे

मैंने इस उत्तर की कोशिश की लेकिन केवल एक बार काम करता है, एक और ताज़ा होने के बाद यह काम नहीं करेगा
medev21

3
दूसरों के लिए बस एक नोट: मैंने किया था app.config['TEMPLATES_AUTO_RELOAD'] = True, और किसी कारण से जब टेम्पलेट बदल गया, तो यह सर्वर को ऑटो रिस्टार्ट देखने की उम्मीद करता है, जैसे यह डिबेट मोड में होता है। यह पुनः आरंभ नहीं करता है, लेकिन यह उस टेम्पलेट को अपडेट करता है जिसे वह प्रस्तुत करता है।
cs01

3
किसी भी कारण से यह 0.12 के लिए काम नहीं करेगा? या कुछ अन्य सेटिंग जो इसे ठीक से सेट करने से रोकेंगी?
user805981 2

3
@ फ़ेडरर यह काम नहीं कर रहा है क्योंकि यह पहले इस्तेमाल किया गया था ... इससे पहले, यह टेम्प्लेट डायरेक्टरी और सब डाइरेक्टरीज़ में बदलावों का पता लगा लेता था और यह सर्वर को पुनः लोड कर देता था .... क्या यह 0.12 में कुछ नया है? बदला हुआ?
user805981

54

जब आप jinjaटेम्प्लेट के साथ काम कर रहे होते हैं , तो आपको कुछ पैरामीटर सेट करने की आवश्यकता होती है। Python3 के साथ मेरे मामले में, मैंने इसे निम्नलिखित कोड के साथ हल किया:

if __name__ == '__main__':
    app.jinja_env.auto_reload = True
    app.config['TEMPLATES_AUTO_RELOAD'] = True
    app.run(debug=True, host='0.0.0.0')

1
आपने मेरी पवित्रता को बचाया। धन्यवाद।
Nostalg.io

मुझे उस समस्या के साथ एक कठिन समय भी हो रहा था। मुझे खुशी है कि मैं मदद कर सकता हूं;)
सिल्गोन

यह फ्लास्क 1.0.2 पर मेरे लिए काम कर रहा है, लेकिन मेरे पास मेजबान तर्क नहीं है।
एनरिको बोरबा

हाँ @EnricoBorba, आपको शायद इसकी आवश्यकता नहीं होगी। मैं आमतौर पर इसका उपयोग करता हूं क्योंकि मैं डॉकटर के साथ स्थानीय में डिबग करता हूं, और कभी-कभी एप्लिकेशन को दूसरे कंटेनर से एक्सेस करने की आवश्यकता होती है। कुछ संदर्भ
सिल्गन

@ सिलगॉन ये मुझे समझ आ गया। मैं मुख्य रूप से केवल टिप्पणी जोड़ने के लिए जोड़ रहा था कि फ्लास्क संस्करण 1.0.2 के नए इंस्टॉलेशन पर काम करने के बारे में
एनरिको बोरबा


10

वास्तव में मेरे लिए TEMPLATES_AUTO_RELOAD = Trueकाम नहीं करता (0.12 संस्करण)। मैं jinja2 का उपयोग करता हूं और मैंने क्या किया है:

  1. समारोह बनाएँ before_request

    def before_request():
        app.jinja_env.cache = {}
  2. इसे आवेदन में पंजीकृत करें

    app.before_request(before_request)
  3. बस।


3
गैरेट, मैंने इन विकल्पों के बिना परीक्षण नहीं किया।
दिक्किनी

चरण 3 वास्तव में आवश्यक नहीं है, इसने मेरे लिए बहुत अच्छा काम किया।
रिकार्डो रिबेरो

4

मेरे लिए जो काम कर रहा है, वह बस इसे जोड़ रहा है:

@app.before_request
def before_request():
    # When you import jinja2 macros, they get cached which is annoying for local
    # development, so wipe the cache every request.
    if 'localhost' in request.host_url or '0.0.0.0' in request.host_url:
        app.jinja_env.cache = {}

( @ dikkini के उत्तर से लिया गया )


2

विंडोज पर फ्लास्क के नवीनतम संस्करण का उपयोग करना, रन कमांड का उपयोग करना और डिबग को सही पर सेट करना; फ्लास्क को प्रभाव में लाने के लिए टेम्पलेट्स में बदलाव के लिए रीसेट करने की आवश्यकता नहीं है। शिफ्ट + एफ 5 (या शिफ्ट प्लस रीलोड बटन) को आज़माएं ताकि यह सुनिश्चित हो सके कि यह कैश्ड नहीं है।



1

जून 2019 तक अद्यतन:

कुप्पी CLI एक डेव सर्वर को चलाने के लिए app.run () से अधिक की सिफारिश की है, हम CLI तो स्वीकार किए जाते हैं समाधान नहीं किया जा सकता का उपयोग करना चाहते, इसलिए यदि।

इस लेखन के रूप में फ्लास्क (1.1) के विकास संस्करण का उपयोग करने से हमें एक पर्यावरण चर FLASK_RUN_EXTRA_FILES सेट करने की अनुमति मिलती है जो प्रभावी रूप से स्वीकृत उत्तर के समान कार्य करता है।

देखिए इस गीथब मुद्दे को

उदाहरण का उपयोग:

export FLASK_RUN_EXTRA_FILES="app/templates/index.html"
flask run

लिनक्स में। कई अतिरिक्त फ़ाइलों को निर्दिष्ट करने के लिए, कॉलोन के साथ अलग फ़ाइल पथ। , जैसे;

export FLASK_RUN_EXTRA_FILES="app/templates/index.html:app/templates/other.html"

सीएलआई --extra-filesफ्लास्क 1.1 के तर्क का भी समर्थन करता है ।


मामूली अद्यतन। 'फ्लास्क सीएलआई' के लिंक को वर्तमान संस्करण में अद्यतन की आवश्यकता है। flask.palletsprojects.com/en/1.1.x/cli अन्यथा धन्यवाद :)
कोडिंगमैटर्स

1

टेम्प्लेट स्वचालित रूप से पुनः लोड हो जाते हैं, ctrl+f5वेबपेज को रीफ्रेश करने के लिए क्यों नहीं , वेब-ब्राउज़र आमतौर पर कैश को बचाते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.