Automatyczne przeładowywanie aplikacji Flask Pythona po zmianie kodu


204

Badam, jak stworzyć przyzwoitą aplikację internetową za pomocą Pythona. Ponieważ nie chcę, aby niektóre wysokopoziomowe struktury stanęły mi na drodze, mój wybór padł na lekką platformę Flask . Czas pokaże, czy to był właściwy wybór.

Więc teraz skonfigurowałem serwer Apache z mod_wsgi, a moja strona testowa działa poprawnie. Chciałbym jednak przyspieszyć procedurę programistyczną poprzez automatyczne ładowanie strony po wszelkich zmianach w plikach py lub szablonach, które wprowadzę. Widzę, że wszelkie zmiany w pliku .wsgi witryny powodują przeładowanie (nawet bez WSGIScriptReloading On w pliku konfiguracyjnym apache), ale nadal muszę go ręcznie nakleić (tj. Wstawić dodatkowy podział wiersza, zapisać). Czy jest jakiś sposób, aby spowodować przeładowanie, gdy edytuję niektóre pliki py aplikacji? A może mam używać IDE, które odświeża plik .wsgi?

Odpowiedzi:


231

Obecnie zalecanym sposobem jest użycie flasknarzędzia wiersza poleceń.

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

Przykład:

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

lub jednym poleceniem:

$ FLASK_APP=main.py FLASK_ENV=development flask run

Jeśli chcesz mieć inny port niż domyślna ( 5000), dodaj --portopcję.

Przykład:

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

Więcej opcji jest dostępnych w:

$ flask run --help

3
lub pyvenv w python3.5, flask runrównież działa, ponieważ kiedy ty pip install flask, plik wykonywalny kolby jest również instalowany w venv/bin/folderze.
TonyTony

Jest to proste rozwiązanie, które można przetłumaczyć na Docker w celach programistycznych. To samo rozwiązanie można zobaczyć tutaj .

1
Działa dobrze normalnie, ale wydaje się, że to nie działa na Ubuntu z kodem na partycji NTFS. Nie ma problemu z kodem, ale kolba nie rozpoznaje zmian w tym ustawieniu.
citynorman

211

Jeśli mówisz o środowiskach test / dev, skorzystaj z opcji debugowania. Automatycznie przeładuje aplikację kolby, gdy nastąpi zmiana kodu.

app.run(debug=True)

Lub z powłoki:

$ export FLASK_DEBUG=1
$ flask run

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


6
Działa to tylko wtedy, gdy witryna jest uruchamiana za pośrednictwem wbudowanego serwera programistycznego. Ale nie podczas uruchamiania go przez wsgi na Apache. I nie nalegam, że naprawdę muszę go uruchomić na Apache, więc może sugerujesz, że jest to właściwy sposób.
Passiday

4
poprawny. W środowisku deweloperskim wbudowany serwer działa naprawdę dobrze i nie trzeba ponownie wymyślać koła, aby przeładować aplikację. Radzę po prostu użyć wbudowanego serwera dla dev. cele. W każdym razie nie chcesz automatycznie przeładowywać aplikacji przy każdej zmianie kodu.
codegeek

44

W środowiskach testowych / programistycznych

Debuger werkzeug ma już dostępną funkcję „automatycznego przeładowania”, którą można włączyć, wykonując jedną z następujących czynności:

app.run(debug=True)

lub

app.debug = True

Możesz także użyć osobnego pliku konfiguracyjnego do zarządzania całą konfiguracją, jeśli zajdzie taka potrzeba. Na przykład używam „settings.py” z opcją „DEBUG = True”. Importowanie tego pliku jest również łatwe;

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

Nie jest to jednak odpowiednie dla środowiska produkcyjnego.

Środowisko produkcyjne

Osobiście wybrałem Nginx + uWSGI zamiast Apache + mod_wsgi z kilku powodów wydajnościowych, ale także opcji konfiguracji. TheDotykowy reload opcja pozwala określić plik / folder, który spowoduje, że aplikacja uWSGI aby przeładować nowo wdrożonego aplikację kolby.

Na przykład skrypt aktualizacji ściąga najnowsze zmiany i dotyka pliku „reload_me.txt”. W twoim skrypcie ini uWSGI (który jest nadzorowany przez Supervisord - oczywiście) znajduje się w nim ta linia:

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

Mam nadzieję, że to pomoże!


1
Dzięki za wspaniałą poradę. Trochę to uprościłem. Utwórz skrypt bash, który dotyka się po uruchomieniu. Dlatego musisz go uruchomić tylko wtedy, gdy chcesz przeładować. Moje rozwiązanie: # touch_me_and_reload.sh dotknij 0 USD
Jabba

@Ewan. gdzie powinna być linia ładowania dotykowego? sekcja [program: uwsig] czy sekcja [superwizor]?
user805981 10.0415

@ user805981 - none, osobny .iniplik konfiguracyjny uwsgi . Jeśli czytasz dokumentację dotyczącą „przeładowania dotykowego”, jest ona w konfiguracji uWSGI, a nie w superwizorze.
Ewan

Dzięki za to. app.run(debug=True)kończy się niepowodzeniem, ale ustawienie zmiennej środowiskowej działa.
Ari

23

Jeśli używasz uwsgi, spójrz na opcję automatycznego przeładowania Pythona:

uwsgi --py-autoreload 1

Przykład 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

root_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

Następnie uruchomić:

uwsgi --ini uwsgi-dev-example.ini

Uwaga: ten przykład włącza także debugger.

Poszedłem tą drogą, aby jak najbardziej naśladować produkcję dzięki mojej konfiguracji nginx. Wystarczy uruchomić aplikację flask z wbudowanym serwerem sieciowym za nginx, co spowodowałoby zły błąd bramy.


16

Kilka aktualizacji Flask 1.0 i nowszych

podstawowe podejście do ponownego ładowania na gorąco to:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run

export FLASK_ENV=developmentpracował dla mnie. app.run(debug=True)nie wydaje się działać.
alex

3

Mam inny pomysł:

Pierwszy:

pip install python-dotenv

Zainstaluj python-dotenv moduł, który odczyta lokalne preferencje środowiska projektowego.

Druga:

Dodaj .flaskenvplik do katalogu projektu. Dodaj następujący kod:

FLASK_ENV=development

Zrobione!

Dzięki tej konfiguracji dla projektu Flask, po uruchomieniu flask runzobaczysz ten wynik w swoim terminalu:

wprowadź opis zdjęcia tutaj

A kiedy edytujesz plik, po prostu zapisz zmianę. Zobaczysz, że automatyczne przeładowanie jest dla Ciebie:

wprowadź opis zdjęcia tutaj

Więcej wyjaśnień:

Oczywiście możesz ręcznie trafić za export FLASK_ENV=developmentkażdym razem, gdy potrzebujesz. Ale użycie innego pliku konfiguracyjnego do obsługi rzeczywistego środowiska pracy wydaje się lepszym rozwiązaniem, dlatego zdecydowanie polecam tę metodę, której używam.


Idealny! nie zapomnij również dołączyć FLASK_APPzmiennej do .flaskenvpliku.
Cequiel

2

Aplikacje kolby można opcjonalnie uruchamiać w trybie debugowania. W tym trybie dwa bardzo wygodne moduły serwera programistycznego o nazwie reloader i debugger domyślnie włączone są . Gdy reloader jest włączony, Flask obserwuje wszystkie pliki kodu źródłowego twojego projektu i automatycznie restartuje serwer, gdy którykolwiek z plików zostanie zmodyfikowany.

Domyślnie tryb debugowania jest wyłączony. Aby ją włączyć, ustaw FLASK_DEBUG=1zmienną środowiskową przed wywołaniem kolby 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

Serwer działający z włączonym przeładowaniem jest niezwykle przydatny podczas programowania, ponieważ za każdym razem, gdy modyfikujesz i zapisujesz plik źródłowy, serwer automatycznie uruchamia się ponownie i odbiera zmianę.



0

$ env: Flask_ENV = "MyAPP.py"

$ env: Flask_ENV = „rozwój”

uruchomić kolbę

To powinno działać


Być może przydałoby się dodać nieco więcej kontekstu do tego pomysłu, na przykład jaki jest zestaw narzędzi, system operacyjny hosta itp.
Manfred
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.