¿Cómo volver a cargar un archivo de configuración en cada solicitud de Flask?

¿Hay alguna forma idiomática de hacer que Flask vuelva a cargar mi archivo de configuración en cada solicitud? El propósito de esto sería que pudiera cambiar las contraseñas u otros elementos relacionados con la configuración sin tener que cerrar y reiniciar el servidor en producción.

Edit: app.run(debug=True) no es aceptable ya que reinicia el servidor y no debe usarse en producción.

Tal vez un decorador como el siguiente:

 def reload_configuration(func): @wraps(func) def _reload_configuration(*args, **kwargs): #even better, only reload if the file has changed reload(settings) app.config.from_object(settings.Config) return func(*args, **kwargs) return _reload_configuration @app.route('/') @reload_configuration def home(): return render_template('home.html') 

Si es relevante, aquí está cómo estoy cargando la configuración ahora:

Mi app/app/__init__.py archivo:

 from flask import Flask from settings import Config app = Flask(__name__) app.config.from_object(Config) # ... 

Mi archivo de app/app/settings.py :

 class Config(object): SQLALCHEMY_TRACK_MODIFICATIONS = False SECRET_KEY = os.urandom(32) # ... try: from app.local_settings import Config except ImportError: pass 

No puede volver a cargar la configuración de forma segura / correcta después de que la aplicación comience a manejar las solicitudes. La configuración solo debe leerse durante la configuración de la aplicación. La razón principal es que un servidor de producción se ejecutará utilizando múltiples procesos (o incluso se distribuirá entre servidores), y el trabajador que maneja la solicitud de cambio de configuración no tiene acceso a otros trabajadores para decirles que cambien. Además, algunas configuraciones no están diseñadas para ser recargadas, por lo que incluso si pudiera notificar a todos los demás trabajadores y hacer que se recarguen correctamente, es posible que no tenga ningún efecto.

Los servidores de producción de WSGI pueden volver a cargarse con gracia, es decir, no matarán a los trabajadores en ejecución hasta que hayan completado sus respuestas, por lo que el tiempo de inactividad no debería ser un problema. Si es (y realmente no lo es), entonces estás en una escala tan grande que estás más allá del scope de esta respuesta.

Recarga agraciada en:

  • Gunicorn
  • uWSGI
  • mod_wsgi

Si necesita usar la configuración que se puede actualizar dinámicamente, tendrá que escribir todo el código que use para esperar eso. Podría usar un controlador before_request para cargar la configuración nueva en cada solicitud. Sin embargo, tenga en cuenta que cualquier cosa que no haya escrito que use config puede no esperar que la configuración cambie.