2014-12-14 16 views
17

Mein Ziel ist es, willkürlichen Code zu erhalten, nachdem die Flaschenapplikation gestartet wurde. Hier ist mein Problem. Ich habe dies bekam (wo app meine Kolben-App ist):Code ausführen, nachdem die Flaschenanwendung gestartet wurde

def run(): 
    from webapp import app 
    app.run(debug=True, use_reloader=False) 

ich im Idealfall würde ich tun, nur diese

def run(): 
    from webapp import app 
    app.run(debug=True, use_reloader=False) 
    some_code() 

aber der Code wird nicht fortgesetzt Vergangenheit app.run(), bis die Server beendet, so some_code() läuft nie

die Lösung ich arbeite im Moment an ist some_code() in einem separaten Thread von app.run() auszuführen, erstellen Sie eine before first request Funktion, die diese Sätze:

app.is_running = True 

Holen Sie sich dann some_code(), um eine Basisanforderung an die App zu senden, damit der Code "vor der ersten Anfrage" ausgeführt wird. Das ist ziemlich kompliziert und es wird schwer sein, Dokumente für ... zu schreiben. Ich würde lieber auf einen app.is_running-Parameter verweisen, der bereits in flask geschrieben ist, oder einen @ app.after_server_start-Dekorator verwenden, aber meines Wissens gibt es keines davon:/

Helfen Sie mir, diesen Code besser zu machen?


Posthumus: jedes Mal wenn ich über diese Frage nachdenkt, macht es mich für ein Flask-Script@app.after_server_start decorator

+4

Warum nicht einfach '@ app.before_first_request' verwenden und * damit erledigt werden *. Warum muss der Code früher ausgeführt werden? –

+2

Mit anderen Worten, warum ist es so wichtig, dass der Code * nach dem Start des Servers * läuft (den Sie im Produktionscode sowieso nicht verwenden können, verwenden Sie stattdessen immer einen richtigen WSGI-Container und nicht den fadenscheinigen für die Entwicklung) nur Werkzeug Server startete mit 'app.run()') aber bevor eine Anfrage einging? –

+2

Vor allem, weil es sinnvoller ist, den Code nach dem Serverstart auszuführen, aber Ihr Recht, dass es nicht so früh ausgeführt werden muss – Cyrin

Antwort

8

verwenden möchten App laufen, dann wie folgt

# manage.py 

from flask.ext.script import Manager 

from myapp import app 

manager = Manager(app) 

def crazy_call(): 
    print("crazy_call") 

@manager.command 
def runserver(): 
    app.run() 
    crazy_call() 

if __name__ == "__main__": 
    manager.run() 
+1

Danke für Ihren Beitrag. Wenn unsere App durch uwsgi läuft, wie integrieren wir diesen Manager? – chefarov

+1

@chefarov verließ Python vor langer Zeit. Ich weiß nicht – CESCO

+0

Es hat nicht für mich funktioniert. Ich musste die Zeilen wie folgt austauschen: app.run() und crazy_call(). – jotacor

8
die runserver Klasse/Methode überschreiben

Wenn Sie Code ausführen müssen, nachdem Ihre flask-Anwendung gestartet wurde, aber streng vor der ersten Anfrage, nicht einmal von der Ausführung der ersten Anfrage ausgelöst werden, wie @ app.before_first_request verarbeiten kann, sollten Sie Flask_Script als CE verwenden SCO sagte, aber man konnte die Klasse Server und überschreiben die __ __ Aufruf Methode, statt Überschreiben der runserver Befehl Unterklasse mit @ manager.command:

from flask import Flask 
from flask_script import Manager, Server 

def custom_call(): 
    #Your code 
    pass 

class CustomServer(Server): 
    def __call__(self, app, *args, **kwargs): 
     custom_call() 
     #Hint: Here you could manipulate app 
     return Server.__call__(self, app, *args, **kwargs) 

app = Flask(__name__) 
manager = Manager(app) 

# Remeber to add the command to your Manager instance 
manager.add_command('runserver', CustomServer()) 

if __name__ == "__main__": 
    manager.run() 

diese Weise können Sie nicht die Standardoptionen von runserver Befehl außer Kraft setzen.

Verwandte Themen