usage python3 last jinja for comment python flask jinja2

python3 - Recargar la aplicación Flask cuando el archivo de plantilla cambie



jinja2 pip (6)

Cuando trabajas con plantillas jinja , necesitas establecer 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'')

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

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

Desafortunadamente, esto parece funcionar solo para los archivos * .py , y no parece encontrar ninguna forma de extender esta funcionalidad a otros archivos. En particular, sería extremadamente útil que Flask reinicie la aplicación cuando cambie una plantilla . He perdido la cuenta de cuántas veces estaba jugando con el marcado en las plantillas y confundiéndome 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 alguna manera de tener los archivos del monitor Flask en el directorio de plantillas , o se necesita bucear en la fuente del framework?

Edición : estoy usando Ubuntu 10.10. No lo he probado en otras plataformas realmente.

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

Pero sucede que en mi aplicación, tengo bastantes componentes reutilizables y parametrizados que utilizo en las plantillas de Jinja. Se implementan como {% macro %} s, residen en "módulos" dedicados y son {% import %} ed en las páginas reales. Todo bien y DRY ... excepto que esas plantillas importadas aparentemente nunca se revisan para modificaciones, ya que no pasan por render_template .

(Curiosamente, esto no ocurre con las plantillas invocadas a través de {% extends %} . En cuanto a {% include %} , no tengo ni 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. porque esa es la solución que realmente utilicé, y funciona como un encanto.


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() . Sin embargo, sus plantillas se usan de manera diferente.

Para volver a cargar su 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)

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


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 la aplicación

    app.before_request(before_request)

  3. Eso es.


Lo que funcionó para mí es solo 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 )


Usar la última versión de Flask en Windows, usando el comando de ejecución y el conjunto de depuración en verdadero; El matraz no necesita reiniciarse para que los cambios a las plantillas entren en efecto. Pruebe Shift + F5 (o Shift más el botón de recarga) para asegurarse de que no haya nada en la memoria caché.


puedes usar

TEMPLATES_AUTO_RELOAD = True

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

Si se deben 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 verifica el archivo original solo en modo de depuración.