Kod değişiklikleri üzerine otomatik yeniden yükleme python Flask uygulaması


205

Python ile iyi bir web uygulaması geliştirmeyi araştırıyorum. Bazı üst düzey yapıların yoluma girmesini istemediğim için, seçimim hafif Flask çerçevesine düştü . Bunun doğru seçim olup olmadığını zaman gösterecek.

Şimdi, mod_wsgi ile bir Apache sunucusu kurdum ve test sitem iyi çalışıyor. Ancak, yaptığım py veya şablon dosyalarında herhangi bir değişiklik olduğunda siteyi otomatik olarak yeniden yükleyerek geliştirme rutinini hızlandırmak istiyorum. Sitenin .wsgi dosyasındaki herhangi bir değişikliğin yeniden yüklenmesine neden olduğunu görüyorum (apache yapılandırma dosyasında WSGIScriptReloading On olmasa bile), ancak yine de manuel olarak (yani, ekstra satır sonu ekle, kaydet) gerekiyor. Uygulamanın py dosyalarından bazılarını düzenlediğimde yeniden yüklemeye neden olmanın bir yolu var mı? Veya, .wsgi dosyasını benim için yenileyen IDE kullanmam bekleniyor?

Yanıtlar:


233

Geçerli önerilen yol, flaskkomut satırı yardımcı programıdır.

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

Misal:

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

veya bir komutta:

$ FLASK_APP=main.py FLASK_ENV=development flask run

Varsayılan ( 5000) ekleme --portseçeneğinden farklı bir bağlantı noktası istiyorsanız .

Misal:

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

Şunlarla daha fazla seçenek mevcuttur:

$ flask run --help

3
veya python3.5'teki pyvenv flask runde çalışır, çünkü siz pip install flaskbir flask yürütülebilir dosyası da venv/bin/klasöre yüklenir .
TonyTony

Bu, geliştirme amacıyla Docker'a çevrilebilen basit bir çözümdür. Aynı çözümü burada görebilirsiniz .

1
Normal olarak iyi çalışır, ancak bu bir NTFS bölümünde kod ile Ubuntu üzerinde çalışmıyor gibi görünüyor. Kodla ilgili bir sorun değil, ancak şişe bu kurulumdaki değişiklikleri tanımıyor gibi görünüyor.
citynorman

211

Test / dev ortamlarından bahsediyorsanız, hata ayıklama seçeneğini kullanın. Bir kod değişikliği gerçekleştiğinde şişe uygulamasını otomatik olarak yeniden yükleyecektir.

app.run(debug=True)

Veya, kabuktan:

$ export FLASK_DEBUG=1
$ flask run

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


6
Bu, yalnızca siteyi yerleşik geliştirme sunucusu üzerinden çalıştırdığınızda çalışır. Ama wsgi ile, Apache'de çalıştırırken değil. Ve gerçekten Apache'de çalıştırmam gerektiğinde ısrar etmiyorum, bu yüzden önerdiğiniz şey bunu yapmanın doğru yolu.
Passiday

4
doğru. Geliştirici ortamında, yerleşik sunucu gerçekten iyi çalışıyor ve uygulamayı yeniden yüklemek için tekerleği yeniden icat etmenize gerek yok. Dev için dahili sunucuyu kullanmanızı şiddetle tavsiye ediyorum. amaçlar. Yine de prod'da, her kod değişikliğinde uygulamayı otomatik olarak yeniden yüklemek istemezsiniz.
codegeek

44

Test / geliştirme ortamlarında

Werkzeug hata ayıklayıcısında, aşağıdakilerden birini yaparak etkinleştirilebilen bir 'otomatik yeniden yükleme' işlevi zaten mevcuttur:

app.run(debug=True)

veya

app.debug = True

Gerekirse tüm kurulumunuzu yönetmek için ayrı bir yapılandırma dosyası da kullanabilirsiniz. Örneğin, 'DEBUG = True' seçeneğiyle 'settings.py' kullanıyorum. Bu dosyayı içe aktarmak da kolaydır;

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

Ancak bu bir üretim ortamı için uygun değildir.

Üretim ortamı

Şahsen ben birkaç performans nedeniyle Apache + mod_wsgi üzerinden Nginx + uWSGI seçtim ama yapılandırma seçenekleri. Dokunmatik yeniden seçeneği uWSGI uygulaması göreve yeni başlayan şişe uygulamasını yeniden sağlayacak bir dosya / klasör belirlemenizi sağlar.

Örneğin, güncelleme komut dosyanız en yeni değişikliklerinizi aşağı çeker ve 'reload_me.txt' dosyasına dokunur. UWSGI ini betiğiniz (Supervisord tarafından tutulur - açıkça) bir yerde bu satırı içeriyor:

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

Umarım bu yardımcı olur!


1
Büyük ipucu için teşekkürler. Biraz basitleştirdim. Yürütüldüğünde kendisine dokunan bir bash betiği oluşturun. Bu nedenle, yalnızca yeniden yükleme istediğinizde başlatmanız gerekir. Benim çözümüm: # touch_me_and_reload.sh $ 0'a dokunun
Jabba

@Ewan. dokunmatik yeniden yükleme hattının nerede olması gerekiyor? [program: uwsig] bölümüne mi yoksa [supervisord] bölümüne mi?
user805981

@ user805981- ayrı bir uwsgi yapılandırma .inidosyası. "Dokunmatik yeniden yükleme" ile ilgili belgeleri okursanız, yönetici değil uWSGI yapılandırmasında bulunur.
Ewan

Bunun için teşekkürler. app.run(debug=True)başarısız olur, ancak çevresel değişkenin ayarlanması çalışır.
Ari

23

Uwsgi kullanarak çalıştırıyorsanız, python otomatik yeniden yükleme seçeneğine bakın:

uwsgi --py-autoreload 1

Örnek 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

O zaman koş:

uwsgi --ini uwsgi-dev-example.ini

Not: Bu örnek ayrıca hata ayıklayıcıyı etkinleştirir.

Nginx kurulumumla üretimi olabildiğince yakın taklit etmek için bu yola gittim. Flask uygulamasını nginx'in arkasında yerleşik web sunucusuyla çalıştırmak kötü bir ağ geçidi hatasına neden olacaktır.


16

Flask 1.0 ve üstü için birkaç güncelleme

sıcak yeniden yüklemeye temel yaklaşım:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
  • kullanmalısın FLASK_ENV=development(değil FLASK_DEBUG=1)
  • bir güvenlik kontrolü olarak, flask run --debuggersadece açık olduğundan emin olmak için koşabilirsiniz
  • Flask CLI artık otomatik gibi şeyler okuyacak FLASK_APPve FLASK_ENVbir varsa .envproje kök dosya ve piton-dotenv yüklü

export FLASK_ENV=developmentbenim için çalıştı. app.run(debug=True)çalışmıyor gibi görünüyor.
alex

3

Farklı bir fikrim var:

İlk:

pip install python-dotenv

python-dotenvProje ortamınız için yerel tercihi okuyacak olan modülü kurun .

İkinci:

.flaskenvProje dizininize dosya ekleyin . Aşağıdaki kodu ekleyin:

FLASK_ENV=development

Bitti!

Flask projeniz için bu yapılandırma ile, çalıştırdığınızda flask runve terminalinizde bu çıkışı göreceksiniz:

resim açıklamasını buraya girin

Dosyanızı düzenlerken, değişikliği kaydedin. Otomatik yeniden yüklemenin sizin için orada olduğunu göreceksiniz:

resim açıklamasını buraya girin

Daha fazla açıklama ile:

Tabii ki export FLASK_ENV=developmenther ihtiyacınız olduğunda manuel olarak vurabilirsiniz . Ancak, gerçek çalışma ortamını işlemek için farklı yapılandırma dosyası kullanmak daha iyi bir çözüm gibi görünüyor, bu yüzden kullandığım bu yöntemi şiddetle tavsiye ediyorum.


Mükemmel! Ayrıca, FLASK_APPdeğişkeni .flaskenvdosyaya eklemeyi de unutmayın .
Cequiel

2

Şişe uygulamaları isteğe bağlı olarak hata ayıklama modunda yürütülebilir. Bu modda, geliştirme sunucusunun yeniden yükleyici ve hata ayıklayıcı olarak adlandırılan iki çok uygun modülü varsayılan olarak etkindir. Yeniden yükleyici etkinleştirildiğinde, Flask projenizin tüm kaynak kod dosyalarını izler ve dosyalardan herhangi biri değiştirildiğinde sunucuyu otomatik olarak yeniden başlatır.

Varsayılan olarak hata ayıklama modu devre dışıdır. Etkinleştirmek için, FLASK_DEBUG=1şişeyi çağırmadan önce bir ortam değişkeni ayarlayın 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

Yeniden yükleyici etkinken çalışan bir sunucuya sahip olmak geliştirme sırasında son derece kullanışlıdır, çünkü bir kaynak dosyayı her değiştirdiğinizde ve kaydettiğinizde sunucu otomatik olarak yeniden başlatılır ve değişikliği alır.



0

$ env: Flask_ENV = "MyAPP.py"

$ env: Flask_ENV = "geliştirme"

flask koşusu

Çalışmalı


Belki de bu fikre biraz daha bağlam eklemek yararlı olabilir, örneğin araç seti, ana bilgisayar işletim sistemi, vb.
Manfred

0

terminalden u söyleyebilirim

expoort FLASK_APP=app_name.py
export FLASK_ENV=development
flask run

veya dosyasında

if __name__ == "__main__":
    app.run(debug=True)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.