run cli python flask flask-script

python - cli - Ejecutar código después de que la aplicación del matraz ha comenzado



flask shell (3)

Mi objetivo es conseguir que se ejecute un código arbitrario después de que se inicie mi aplicación Flask. Aquí está lo que tengo:

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

Lo ideal sería poder hacer esto:

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

Pero el código no continúa más allá de app.run() , por lo que some_code () nunca se ejecuta.

La solución en la que estoy trabajando en este momento es ejecutar some_code () en un subproceso separado de app.run (), crear una función de solicitud previa que establezca esto:

app.is_running = True

Luego obtenga some_code () para disparar una solicitud básica a la aplicación, de modo que se ejecute el código ''antes de la primera solicitud''. Esto es bastante complicado y va a ser difícil de documentar. Preferiría usar el parámetro app.is_running que ya se proporciona en Flask, o usar un decorador @app.after_server_start , pero que yo sepa, ninguno de ellos existe.

¿Ayudarme a hacer este código mejor?

Póstumo: Cada vez que pienso en este problema, me hace desear que haya un decorador @app.after_server_start .


Me encontré con este mismo problema en una aplicación matraz mía. Quería iniciar un programador al inicio de la aplicación, lo que daría inicio a algunos trabajos a intervalos regulares. Como implementé mis aplicaciones dentro de los contenedores de la ventana acoplable, lo que terminé haciendo es agregar un punto final de "comprobación de estado" que solo devuelve un 200, y en mi ventana de conexión configurada ese punto final:

HEALTHCHECK CMD curl --fail http://localhost:8080/alive || exit 1

El comportamiento predeterminado es ejecutar ese comando cada 30 s, y la primera ejecución inicia de manera conveniente el método init (). https://docs.docker.com/engine/reference/builder/#healthcheck


Si necesita ejecutar algún código después de que se inicie su aplicación de matraz pero estrictamente antes de la primera solicitud, ni siquiera se activará con la ejecución de la primera solicitud como puede manejar @ app.before_first_request, debe usar Flask_Script, como dijo CESCO, pero podría crear una subclase de la clase Servidor y sobrescribir el método __ call __, en lugar de sobrescribir el comando runserver con @ 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()

De esta manera no anula las opciones predeterminadas del comando runserver.


Use Flask-Script para ejecutar su aplicación, luego sobrescriba la clase / método de servidor de ejecución como este

# 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()