resueltos - lista de funciones de python
¿Cuál es el enfoque correcto para llamar funciones después de ejecutar una aplicación de matraz? (2)
Estoy un poco confundido acerca de cómo hacer algo que pensé que sería bastante simple. Tengo una aplicación simple escrita usando Flask
. Se ve algo como esto:
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 __name__ == "__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)
Lo que estoy descubriendo es que mi terminal está emitiendo las instrucciones de impresión en _run_on_start
pero no en el otro código de depuración habitual de la aplicación Flask. Si elimino la llamada antes de app.run, la salida es normal. Además estoy encontrando que la salida de _run_on_start
se repite dos veces en el inicio, aunque no sé si es una salida extraña o la función se llama dos veces.
Supongo que esta no es la forma correcta de agregar una llamada a función antes de llamar a app.run
. Busqué en los documentos de Flask y encontré menciones de varios decoradores que uno puede usar, que le permiten ejecutar una función antes / después de ciertas solicitudes, pero quiero ejecutar la llamada cuando se ejecuta el servidor de la aplicación.
Además, me doy cuenta de que si llamo a este módulo desde otro módulo, es decir, no cuando __name__ != "__main__"
, no _run_on_start
mi llamada a _run_on_start
.
¿Cuál es el enfoque correcto aquí? En ambos casos cuando estoy empezando desde CL y desde otro módulo?
La salida duplicada de su función puede ser explicada por el recargador. Lo primero que hace es iniciar la función principal en un nuevo hilo para que pueda monitorear los archivos fuente y reiniciar el hilo cuando cambien. use_reloader=False
con la opción use_reloader=False
.
Si desea poder ejecutar su función al iniciar el servidor desde un módulo diferente, envuélvalo en una función y llame a esa función desde el otro módulo:
def run_server(dom):
_run_on_start("%s" % dom)
app.run(debug=True, use_reloader=False)
if __name__ == ''__main__'':
if len(sys.argv) < 2:
raise Exception("Must provide domain for application execution.")
else:
DOM = sys.argv[1]
run_server(DOM)
El "enfoque correcto" depende de lo que realmente está tratando de lograr aquí. El servidor integrado está destinado a ejecutar su aplicación en un entorno de prueba local antes de implementarlo en un servidor de producción, por lo que el problema de iniciarlo desde un módulo diferente no tiene mucho sentido por sí mismo.
Probablemente estabas buscando el decorador Flask.before_first_request
, como en:
@app.before_first_request
def _run_on_start(a_string):
print "doing something important with %s" % a_string