कोड परिवर्तन पर ऑटो रीलोडिंग पायथन फ्लास्क ऐप


204

मैं जांच कर रहा हूं कि पायथन के साथ एक सभ्य वेब ऐप कैसे विकसित किया जाए। चूँकि मैं अपने रास्ते में कुछ उच्च-स्तरीय संरचनाएँ नहीं चाहता, इसलिए मेरी पसंद हल्के फ्लास्क ढांचे पर पड़ी । समय बताएगा कि क्या यह सही विकल्प था।

इसलिए, अब मैंने mod_wsgi के साथ एक अपाचे सर्वर स्थापित किया है, और मेरी परीक्षण साइट ठीक चल रही है। हालाँकि, मैं साइट को अपने द्वारा किए गए py या टेम्पलेट फ़ाइलों में किसी भी परिवर्तन पर स्वचालित रूप से पुनः लोड करके विकास दिनचर्या को गति देना चाहूंगा। मैं देखता हूं कि साइट की .wsgi फ़ाइल में कोई भी परिवर्तन पुनः लोड होने का कारण बनता है (Apache config फाइल में WSGIScriptReloading के बिना भी), लेकिन मुझे अभी भी इसे मैन्युअल रूप से उड़ाना है (यानी, अतिरिक्त लाइनब्रेक डालें, बचाएं)। क्या कोई तरीका है जब मैं ऐप की कुछ py फाइल्स को एडिट करता हूँ तो कैसे पुनः लोड करें? या, मुझे आईडीई का उपयोग करने की उम्मीद है जो मेरे लिए .wsgi फ़ाइल को ताज़ा करता है?

जवाबों:


230

वर्तमान अनुशंसित तरीका flaskकमांड लाइन उपयोगिता के साथ है।

https://flask.palletsprojects.com/en/1.1.x/quickstart/#debug-mode

उदाहरण:

$ export FLASK_APP=main.py
$ export FLASK_ENV=development
$ flask run

या एक कमांड में:

$ FLASK_APP=main.py FLASK_ENV=development flask run

अगर आप डिफॉल्ट ( 5000) एड --portऑप्शन से अलग पोर्ट चाहते हैं ।

उदाहरण:

$ FLASK_APP=main.py FLASK_ENV=development flask run --port 8080

इसके साथ और विकल्प उपलब्ध हैं:

$ flask run --help

3
या python3.5 में pyvenv flask runभी काम करता है, जब से, आप pip install flaskएक फ्लास्क निष्पादन योग्य फ़ाइल भी venv/bin/फ़ोल्डर में स्थापित है ।
TonyTony

यह एक सरल समाधान है जिसे विकास उद्देश्यों के लिए डॉकर में अनुवाद किया जा सकता है। इसका एक ही समाधान यहाँ देख सकते हैं ।

सामान्य रूप से अच्छी तरह से काम करता है, लेकिन यह Ubuntu पर NTFS विभाजन पर कोड के साथ काम नहीं करता है। कोड के साथ कोई समस्या नहीं है, लेकिन फ्लास्क उस सेटअप में परिवर्तन को पहचानता नहीं है।
शहरनर्मन

211

यदि आप परीक्षण / देव वातावरण के बारे में बात कर रहे हैं, तो बस डिबग विकल्प का उपयोग करें। कोड परिवर्तन होने पर यह फ्लास्क ऐप को ऑटो-रीलोड करेगा।

app.run(debug=True)

या, शेल से:

$ export FLASK_DEBUG=1
$ flask run

http://flask.pocoo.org/docs/quickstart/#debug-mode


6
यह तभी काम करता है जब आप बिल्ट-इन डेवलपमेंट सर्वर के माध्यम से साइट चलाते हैं। लेकिन अपाचे पर wsgi के माध्यम से इसे चलाने पर नहीं। और मैं जोर देकर नहीं कहता कि मुझे वास्तव में इसे अपाचे पर चलाने की जरूरत है, इसलिए हो सकता है कि आप जो सुझाव दें वह करने का सही तरीका हो।
पासिडे

4
सही बात। देव वातावरण में, सर्वर में निर्मित वास्तव में अच्छी तरह से काम करता है और आपको ऐप को फिर से लोड करने के लिए पहिया को फिर से बनाने की आवश्यकता नहीं है। मैं दृढ़ता से आपको सलाह देता हूं कि आप सिर्फ देव के लिए सर्वर का उपयोग करें। प्रयोजनों। वैसे भी, आप हर कोड परिवर्तन पर ऐप को फिर से लोड नहीं करना चाहते हैं।
codegeek

44

परीक्षण / विकास के वातावरण में

Werkzeug डिबगर में पहले से ही एक 'ऑटो पुनः लोड' फ़ंक्शन उपलब्ध है जिसे निम्नलिखित में से एक करके सक्षम किया जा सकता है:

app.run(debug=True)

या

app.debug = True

यदि आपको आवश्यकता हो तो आप अपने सभी सेटअप को प्रबंधित करने के लिए एक अलग कॉन्फ़िगरेशन फ़ाइल का उपयोग कर सकते हैं। उदाहरण के लिए मैं 'DEBUG = True' विकल्प के साथ 'सेटिंग' का उपयोग करता हूं। इस फ़ाइल को आयात करना भी आसान है;

app.config.from_object('application.settings')

हालांकि यह उत्पादन वातावरण के लिए उपयुक्त नहीं है।

उत्पादन वातावरण

व्यक्तिगत रूप से मैंने कुछ प्रदर्शन कारणों के लिए अपाचे + mod_wsgi पर Nginx + uWSGI को चुना, लेकिन कॉन्फ़िगरेशन विकल्प भी। स्पर्श पुनः लोड विकल्प आपको लगता है कि uWSGI आवेदन अपने नए तैनात कुप्पी एप्लिकेशन को फिर से लोड करने के लिए कारण होगा एक फ़ाइल / फ़ोल्डर निर्दिष्ट करने के लिए अनुमति देता है।

उदाहरण के लिए, आपकी अपडेट स्क्रिप्ट आपके नवीनतम परिवर्तनों को नीचे खींचती है और 'reload_me.txt' फ़ाइल को छूती है। आपकी uWSGI आईआई स्क्रिप्ट (जिसे सुपरवाइजर द्वारा रखा गया है - जाहिर है) में यह रेखा कहीं न कहीं है:

touch-reload = '/opt/virtual_environments/application/reload_me.txt'

आशा है कि ये आपकी मदद करेगा!


1
उत्कृष्ट टिप के लिए धन्यवाद। मैंने इसे थोड़ा सरल किया। एक बैश स्क्रिप्ट बनाएं जो निष्पादित होने पर खुद को छू ले। इस प्रकार आपको केवल इसे तब लॉन्च करने की आवश्यकता होती है जब आप पुनः लोड चाहते हैं। मेरा हल: # touch_me_and_reload.sh टच $ 0
Jabba

@Ewan। स्पर्श-पुनः लोड लाइन को कहाँ माना जाता है? [कार्यक्रम: uwsig] अनुभाग या [पर्यवेक्षक] अनुभाग?
user805981

@ user805981- न तो, एक अलग uwsgi कॉन्फ़िगरेशन .iniफ़ाइल। यदि आप "टच-रीलोड" पर दस्तावेज़ीकरण पढ़ते हैं, तो यह uWSGI में है, पर्यवेक्षक, कॉन्फ़िगरेशन नहीं।
इवान

इसके लिए धन्यवाद। app.run(debug=True)विफल रहता है, लेकिन पर्यावरण चर कार्यों की स्थापना।
अरी

23

यदि आप अजगर ऑटो पुनः लोड विकल्प पर uwsgi देखो का उपयोग कर चल रहे हैं:

uwsgi --py-autoreload 1

उदाहरण uwsgi-dev-example.ini:

[uwsgi]
socket = 127.0.0.1:5000
master = true
virtualenv = /Users/xxxx/.virtualenvs/sites_env
chdir = /Users/xxx/site_root
module = site_module:register_debug_server()
callable = app
uid = myuser
chmod-socket = 660
log-date = true
workers = 1
py-autoreload = 1

site_root / __ init__.py

def register_debug_server():
    from werkzeug.debug import DebuggedApplication

    app = Flask(__name__)
    app.debug = True
    app = DebuggedApplication(app, evalex=True)
    return app

फिर भागो:

uwsgi --ini uwsgi-dev-example.ini

नोट: यह उदाहरण डिबगर को भी सक्षम बनाता है।

मैं अपने nginx सेटअप के साथ जितना संभव हो उतना उत्पादन की नकल करने के लिए इस मार्ग पर गया। बस इसके साथ फ्लास्क ऐप को चलाने के लिए इसे नगीनक्स के पीछे वेब सर्वर में बनाया गया है जिसके परिणामस्वरूप यह एक खराब गेटवे त्रुटि होगी।


16

फ्लास्क 1.0 और इसके बाद के संस्करण के लिए कुछ अपडेट

गर्म पुनः लोड करने के लिए मूल दृष्टिकोण है:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
  • आपको उपयोग करना चाहिए FLASK_ENV=development(नहीं FLASK_DEBUG=1)
  • सुरक्षा जांच के रूप में, आप flask run --debuggerयह सुनिश्चित करने के लिए बस चला सकते हैं कि यह चालू है
  • फ्लास्क सीएलआई अब स्वचालित रूप से चीजों को पढ़ेगा जैसे FLASK_APPऔर FLASK_ENVअगर आपके पास .envप्रोजेक्ट रूट में एक फाइल है और अजगर-डॉटेन स्थापित है

export FLASK_ENV=developmentमेरे लिए काम किया। app.run(debug=True)काम करने के लिए प्रकट नहीं होता है।
एलेक्स

3

मुझे एक अलग विचार मिला:

प्रथम:

pip install python-dotenv

python-dotenvमॉड्यूल को स्थापित करें , जो आपके प्रोजेक्ट पर्यावरण के लिए स्थानीय प्राथमिकता पढ़ेगा।

दूसरा:

.flaskenvअपनी परियोजना निर्देशिका में फ़ाइल जोड़ें । निम्नलिखित कोड जोड़ें:

FLASK_ENV=development

हॊ गया!

अपने फ्लास्क प्रोजेक्ट के लिए इस विन्यास के साथ, जब आप चलते हैं flask runऔर आप अपने टर्मिनल में इस आउटपुट को देखेंगे:

यहां छवि विवरण दर्ज करें

और जब आप अपनी फ़ाइल को संपादित करते हैं, तो बस परिवर्तन को सहेजें। आप देखेंगे कि ऑटो-रीलोड आपके लिए है:

यहां छवि विवरण दर्ज करें

अधिक स्पष्टीकरण के साथ:

बेशक आप export FLASK_ENV=developmentहर बार जरूरत पड़ने पर खुद को हिट कर सकते हैं । लेकिन वास्तविक काम के माहौल को संभालने के लिए विभिन्न कॉन्फ़िगरेशन फ़ाइल का उपयोग करना बेहतर समाधान की तरह लगता है, इसलिए मैं इस पद्धति का दृढ़ता से उपयोग करने की सलाह देता हूं।


उत्तम! इसके अलावा, FLASK_APPचर को .flaskenvफ़ाइल में शामिल करना न भूलें ।
Cequiel

2

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

डिफ़ॉल्ट रूप से, डिबग मोड अक्षम है। इसे सक्षम करने के लिए, FLASK_DEBUG=1फ्लास्क लागू करने से पहले एक पर्यावरण चर सेट करें run:

(venv) $ export FLASK_APP=hello.py for Windows use > set FLASK_APP=hello.py

(venv) $ export FLASK_DEBUG=1 for Windows use > set FLASK_DEBUG=1

(venv) $ flask run

* Serving Flask app "hello"
* Forcing debug mode on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 273-181-528

सक्षम किए गए रिलोडर के साथ चलने वाला सर्वर विकास के दौरान बेहद उपयोगी है, क्योंकि हर बार जब आप संशोधित करते हैं और स्रोत फ़ाइल को सहेजते हैं, तो सर्वर स्वचालित रूप से पुनरारंभ होता है और परिवर्तन को उठाता है।


1

PyCharm सेट 'पर्यावरण चर' अनुभाग में इसे प्राप्त करने के लिए:

PYTHONUNBUFFERED=1;
FLASK_DEBUG=1

फ्लास्क के लिए 'रन / डीबग कॉन्फ़िगरेशन'।


PyCharm प्रो उपयोगकर्ताओं के लिए, आप एक अलग डिबग कॉन्फ़िगरेशन सेटअप
Ty Hitzeman

0

$ env: Flask_ENV = "MyAPP.py"

$ env: Flask_ENV = "विकास"

कुप्पी चलाना

इस पर काम किया जाना चाहिए


शायद इस विचार के लिए थोड़ा और संदर्भ जोड़ना उपयोगी होगा, उदाहरण के लिए उपकरण सेट, होस्ट ऑपरेटिंग सिस्टम, आदि क्या है
Manfred
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.