Volver a cargar la aplicación Frask cuando la plantilla de archivos cambia

De forma predeterminada, al ejecutar la aplicación Flask utilizando el servidor incorporado ( Flask.run ), supervisa sus archivos de Python y vuelve a cargar la aplicación automáticamente si cambia su código:

 * Detected change in '/home/xion/hello-world/app.py', reloading * Restarting with reloader 

Desafortunadamente, esto parece funcionar solo para archivos * .py , y no encuentro ninguna forma de extender esta funcionalidad a otros archivos. En particular, sería extremadamente útil hacer que Flask reinicie la aplicación cuando cambie una plantilla . He perdido la cuenta de cuántas veces jugué con el marcado en las plantillas y me confundí al no ver ningún cambio, solo para descubrir que la aplicación todavía estaba usando la versión anterior de la plantilla de Jinja.

Entonces, ¿hay una manera de tener archivos de monitor de Flask en el directorio de plantillas , o requiere que se adentre en la fuente del marco?

Edición : estoy usando Ubuntu 10.10. No he probado eso en ninguna otra plataforma realmente.


Después de una investigación adicional, descubrí que los cambios en las plantillas se actualizan en tiempo real, sin volver a cargar la aplicación. Sin embargo, esto parece aplicarse solo a las plantillas que se pasan a flask.render_template .

Pero sucede que en mi aplicación, tengo bastantes componentes reutilizables y parametrizados que uso en las plantillas de Jinja. Se implementan como {% macro %} s, residen en “módulos” dedicados y {% import %} ed en las páginas reales. Todo agradable y SECO … excepto que esas plantillas importadas aparentemente nunca se render_template para render_template modificaciones, ya que no pasan a través de render_template en absoluto.

(Curiosamente, esto no ocurre con las plantillas invocadas a través de {% extends %} . En cuanto a {% include %} , no tengo idea, ya que realmente no las uso).

Entonces, para concluir, las raíces de este fenómeno parecen estar en algún lugar entre Jinja y Flask o Werkzeug. Supongo que puede justificar un viaje al rastreador de errores para cualquiera de esos proyectos 🙂 Mientras tanto, he aceptado el jd. La respuesta porque esa es la solución que realmente utilicé, y funciona a la perfección.

En mi experiencia, las plantillas ni siquiera necesitan que la aplicación se reinicie para actualizarse, ya que deben cargarse desde el disco cada vez que se llama a render_template() . Tal vez sus plantillas se utilizan de manera diferente sin embargo.

Para volver a cargar la aplicación cuando cambien las plantillas (o cualquier otro archivo), puede pasar el argumento extra_files a Flask().run() , una colección de nombres de archivos para ver: cualquier cambio en esos archivos activará el recargador.

Ejemplo:

 from os import path extra_dirs = ['directory/to/watch',] extra_files = extra_dirs[:] for extra_dir in extra_dirs: for dirname, dirs, files in os.walk(extra_dir): for filename in files: filename = path.join(dirname, filename) if path.isfile(filename): extra_files.append(filename) app.run(extra_files=extra_files) 

Consulte aquí: http://werkzeug.pocoo.org/docs/0.10/serving/?highlight=run_simple#werkzeug.serving.run_simple

puedes usar

 TEMPLATES_AUTO_RELOAD = True 

De http://flask.pocoo.org/docs/1.0/config/

Ya sea para verificar las modificaciones de la fuente de la plantilla y volver a cargarla automáticamente. Por defecto, el valor es Ninguno, lo que significa que Flask comprueba el archivo original solo en el modo de depuración.

Cuando trabaja con plantillas jinja , necesita configurar algunos parámetros. En mi caso con python3, lo resolví con el siguiente código:

 if __name__ == '__main__': app.jinja_env.auto_reload = True app.config['TEMPLATES_AUTO_RELOAD'] = True app.run(debug=True, host='0.0.0.0') 

En realidad, para mí, TEMPLATES_AUTO_RELOAD = True no funciona (versión 0.12). Yo uso jinja2 y lo que he hecho:

  1. Crear función before_request

     def before_request(): app.jinja_env.cache = {} 
  2. Registrarlo en aplicación

     app.before_request(before_request) 
  3. Eso es.

Lo que funcionó para mí es simplemente agregar esto:

 @app.before_request def before_request(): # When you import jinja2 macros, they get cached which is annoying for local # development, so wipe the cache every request. if 'localhost' in request.host_url or '0.0.0.0' in request.host_url: app.jinja_env.cache = {} 

( tomado de la respuesta de @dikkini )

Usando la última versión de Flask en Windows, usando el comando de ejecución y el conjunto de depuración en verdadero; No es necesario reiniciar el matraz para que los cambios en las plantillas se realicen. Pruebe Shift + F5 (o Shift más el botón de recargar) para asegurarse de que no se almacene en caché.

Para mi funciona bien

  from flask import Flask, render_template, request, url_for, redirect app = Flask(__name__) app.config["TEMPLATES_AUTO_RELOAD"] = True 

Ver más en http://flask.pocoo.org/docs/1.0/config/

Consulte http://flask.pocoo.org/docs/1.0/quickstart/ y use FLASK_ENV=development