webentwicklung-frage-antwort-db.com.de

Was ist der richtige Ansatz, um Funktionen aufzurufen, nachdem eine Flaschen-App ausgeführt wurde?

Ich bin ein wenig verwirrt darüber, wie man etwas macht, von dem ich dachte, dass es ziemlich einfach wäre. Ich habe eine einfache App, die mit Flask geschrieben wurde. Es sieht ungefähr so ​​aus:

from flask import Flask

app = Flask(__name__)

def _run_on_start(a_string):
    print "doing something important with %s" % a_string

@app.route('/')
def root():
    return 'hello world'

if __== "__main__":
    if len(sys.argv) < 2:
        raise Exception("Must provide domain for application execution.")
    else:
        DOM = sys.argv[1]
        _run_on_start("%s" % DOM)
        app.run(debug=True)

Ich stelle fest, dass mein Terminal die print-Anweisungen in _run_on_start ausgibt, aber nicht in dem anderen üblichen Flask-App-Debug-Code. Wenn ich den Anruf vor app.run entferne, ist die Ausgabe normal. Außerdem wird die Ausgabe von _run_on_start beim Start zweimal wiederholt, obwohl ich nicht weiß, ob es sich um eine seltsame Ausgabe handelt oder ob die Funktion tatsächlich zweimal aufgerufen wird.

Ich gehe davon aus, dass dies nicht der richtige Weg ist, um einen Funktionsaufruf hinzuzufügen, bevor Sie app.run aufrufen. Ich habe in den Flask-Dokumenten nachgeschlagen und Erwähnungen verschiedener Dekorateure gefunden, mit denen Sie eine Funktion vor/nach bestimmten Anforderungen ausführen können. Ich möchte den Aufruf jedoch ausführen, wenn der App-Server ausgeführt wird.

Außerdem stelle ich fest, dass ich, wenn ich dieses Modul von einem anderen Modul aus aufrufe, d. H. Nicht, wenn __!= "__main__", meinen _run_on_start nicht anrufe.

Was ist der richtige Ansatz hier? In beiden Fällen, wenn ich vom CL und von einem anderen Modul aus starte?

28
Edwardr

Die doppelte Ausgabe Ihrer Funktion kann durch den Reloader erklärt werden. Als Erstes wird die Hauptfunktion in einem neuen Thread gestartet, sodass die Quelldateien überwacht und der Thread bei Änderungen erneut gestartet werden kann. Deaktivieren Sie dies mit der Option use_reloader=False.

Wenn Sie Ihre Funktion beim Starten des Servers von einem anderen Modul aus ausführen möchten, packen Sie sie in eine Funktion ein und rufen Sie diese Funktion aus dem anderen Modul auf:

def run_server(dom):
        _run_on_start("%s" % dom)
        app.run(debug=True, use_reloader=False)

if __== '__main__':
    if len(sys.argv) < 2:
        raise Exception("Must provide domain for application execution.")
    else:
        DOM = sys.argv[1]
        run_server(DOM)

Der "richtige Ansatz" hängt davon ab, was Sie hier tatsächlich erreichen wollen. Der integrierte Server ist dafür gedacht, Ihre Anwendung in einer lokalen Testumgebung auszuführen, bevor Sie sie auf einem Produktionsserver bereitstellen. Das Problem, wenn Sie sie von einem anderen Modul aus starten, ist daher allein wenig sinnvoll.

13
robots.jpg

Wahrscheinlich haben Sie nach Flask.before_first_request Dekorateur gesucht, wie in:

@app.before_first_request
def _run_on_start(a_string):
    print "doing something important with %s" % a_string
44
the-happy-hippo
from flask import Flask

def create_app():
    app = Flask(__name__)
    def run_on_start(*args, **argv):
        print "function before start"
    run_on_start()
    return app

app = create_app()

@app.route("/")
def hello():
    return "Hello World!"
0
Peretz30