Automatisches Neuladen der Flask-App, wenn sich der Quellcode ändert

10

Ich weiß, dass Flask im Debug-Modus Änderungen an .py-Quellcodedateien erkennt und sie neu lädt, wenn neue Anfragen eingehen.

Ich habe das immer in meiner App gesehen. Ändern Sie einen kleinen Text in einem @ app.route-Dekobereich in meiner Datei "views.py", und ich konnte die Änderungen im Browser bei der Aktualisierung sehen.

Aber plötzlich (ich kann mich nicht erinnern, was sich geändert hat) scheint das nicht mehr zu funktionieren.

F: Wo gehe ich falsch?

Ich arbeite auf einem OSX 10.9-System mit einem VENV-Setup mit Python 2.7. Ich verwende foreman start in meinem Projektstamm, um es zu starten.

App-Struktur ist wie folgt:

%Vor%

Die Dateien sehen so aus:

%Vor% %Vor% %Vor% %Vor% %Vor%     
HanSooloo 01.05.2014, 01:03
quelle

3 Antworten

9

Das Problem hier ist, wie in anderen Antworten angegeben, dass es so aussieht, als ob Sie von python run.py nach foreman start umgezogen sind, oder Sie Ihre Procfile von

geändert haben %Vor%

bis

%Vor%

Wenn Sie foreman start ausführen, werden einfach die Befehle ausgeführt, die Sie in Procfile angegeben haben. (Ich gehe davon aus, dass Sie mit Heroku arbeiten, aber selbst wenn nicht, ist das nett, weil es simuliert, was auf Ihrem Server läuft / Heroku-Prüfpunkt / was auch immer.)

Wenn Sie nun gunicorn --log-level=DEBUG run:app (über foreman start ) ausführen, führen Sie Ihre Anwendung jetzt mit gunicorn aus und nicht mit dem integrierten Webserver, der mit Flask geliefert wird. Das Argument run:app weist gunicorn an, in run.py nach einer Flask -Instanz namens app zu suchen, sie zu importieren und auszuführen. Hier macht es Spaß: da run.py importiert wird, ist __name__ == '__main__' False (mehr dazu hier ), und so wird app.run(debug = True, port = 5000) nie aufgerufen.

Dies ist, was Sie wollen (zumindest in einer Einstellung, die öffentlich verfügbar ist), da der Webserver, der in Flask erstellt wurde, der verwendet wird, wenn app.run() aufgerufen wird, einige ziemlich ernsthafte Sicherheitslücken aufweist. Das --log-level=DEBUG mag auch ein wenig irreführend sein, da es das Wort "DEBUG" verwendet, aber es gibt nur gunicorn an, welche Protokollierungsanweisungen zu drucken sind und welche ignoriert werden sollen (siehe Python-Dokumente bei der Protokollierung .

Die Lösung besteht darin, python run.py auszuführen, wenn Sie die App lokal ausführen und daran arbeiten / debuggen. Führen Sie nur foreman start aus, wenn Sie eine Produktionsumgebung nachahmen möchten. Da gunicorn nur das Objekt app importieren muss, könnten Sie einige Mehrdeutigkeiten entfernen und Ihre Procfile in

ändern %Vor%

Sie können sich auch das Flask-Skript ansehen, das über einen integrierten Befehl python manage.py runserver verfügt, der den Build ausführt im Flask-Webserver im Debug-Modus.

    
erik 28.11.2014, 17:40
quelle
3

Die Lösung bestand darin, die Verwendung von foreman start wie in den Kommentaren angegeben zu beenden und python run.py direkt auszuführen.

Auf diese Weise wird die app.run -Methode mit den Konfigurationsparametern debug=True und use_reloader=True wirksam.

    
HanSooloo 03.05.2014 16:47
quelle
2

Beispielanwendung, in der app unsere Anwendung ist und diese Anwendung in der Datei start.py gespeichert wurde:

%Vor%

Jetzt starten wir die Anwendung von der Shell mit dem Flag - reload

%Vor%

und gunicorn lädt die Anwendung in dem Moment neu, in dem sich die Datei automatisch geändert hat. Keine Notwendigkeit, irgendetwas zu ändern.

Wenn Sie diese Anwendung im Hintergrund ausführen möchten, fügen Sie das Flag -D

hinzu %Vor%
  

-D Demon-Modus

     

-w Anzahl der Arbeiter

     

-b Adresse und Port

     

start (start.py): App - Anwendung

     

- Laden Sie die Dateiüberwachung von gunicorns neu

Sehen Sie sich die Einstellungsdatei an: Ссылка

Alle Optionen und Flags sind dort erwähnt. Viel Spaß!

    
SmileMZ 18.04.2016 00:21
quelle

Tags und Links