python - meaning - ¿Por qué ejecutar el servidor de desarrollo de Flask se ejecuta dos veces?
flask wikipedia (3)
El recargador Werkzeug genera un proceso secundario para que pueda reiniciar ese proceso cada vez que cambie su código. Werkzeug es la biblioteca que suministra Flask con el servidor de desarrollo cuando llama a app.run()
.
Ver el código de la función restart_with_reloader()
; su script se ejecuta nuevamente con subprocess.call()
.
Si configura use_reloader
en False
, verá que el comportamiento se va, pero también perderá la funcionalidad de recarga:
app.run(port=4004, debug=config.DEBUG, host=''0.0.0.0'', use_reloader=False)
Puede desactivar el recargador cuando usa también el comando de flask run
del flask run
:
FLASK_DEBUG=1 flask run --no-reload
Puede buscar la variable de entorno WERKZEUG_RUN_MAIN
si desea detectar cuando está en el proceso secundario de recarga:
import os
if os.environ.get(''WERKZEUG_RUN_MAIN'') == ''true'':
print ''################### Restarting @ {} ###################''.format(
datetime.utcnow())
Sin embargo, si necesita configurar módulos globales, entonces debe usar el decorador @app.before_first_request
en una función y tener esa función configurada como globales. Se llamará solo una vez después de cada recarga cuando llegue la primera solicitud:
@app.before_first_request
def before_first_request():
print ''########### Restarted, first request @ {} ############''.format(
datetime.utcnow())
Tenga en cuenta que si ejecuta esto en un servidor WSGI a gran escala que utiliza bifurcaciones o nuevos subprocesos para manejar solicitudes, se pueden invocar los manejadores before_first_request
para cada nuevo subproceso.
Estoy usando Flask para desarrollar un sitio web y mientras estoy en desarrollo ejecuto el matraz usando el siguiente archivo:
#!/usr/bin/env python
from datetime import datetime
from app import app
import config
if __name__ == ''__main__'':
print ''################### Restarting @'', datetime.utcnow(), ''###################''
app.run(port=4004, debug=config.DEBUG, host=''0.0.0.0'')
Cuando inicio el servidor o cuando se reinicia automáticamente porque los archivos se han actualizado, siempre muestra la línea de impresión dos veces:
################### Restarting @ 2014-08-26 10:51:49.167062 ###################
################### Restarting @ 2014-08-26 10:51:49.607096 ###################
Aunque en realidad no es un problema (el resto funciona como se esperaba), simplemente me pregunto por qué se comporta así. ¿Algunas ideas?
Si está utilizando el comando moderno de flask run
, no se utiliza ninguna de las opciones de app.run
. Para desactivar completamente el recargador, pase --no-reload
:
FLASK_DEBUG=1 flask run --no-reload
Además, __name__ == ''__main__''
nunca será verdadero porque la aplicación no se ejecuta directamente. Use las mismas ideas de share de share , excepto sin el bloque __main__
.
if os.environ.get(''WERKZEUG_RUN_MAIN'') != ''true'':
# do something only once, before the reloader
if os.environ.get(''WERKZEUG_RUN_MAIN'') == ''true'':
# do something each reload
Tuve el mismo problema, y lo resolví configurando app.debug
en False
. Establecerlo en True
causaba que mi __name__ == "__main__"
se llamara dos veces.
(Lo habría publicado como un comentario, pero no tengo suficientes representantes. Publicado como respuesta con la esperanza de que pueda ayudar a alguien más)