Estoy usando plantillas Jinja2 con Bottle.py y dev_appserver de Google App Engine para el desarrollo. Quiero que las plantillas se vuelvan a cargar automáticamente en cada solicitud (o idealmente solo cuando cambien), para que no tenga que seguir reiniciando el servidor.¿Cuál es la mejor manera de desactivar el almacenamiento en caché de plantillas Jinja2 en bottle.py?
De acuerdo con los documentos de la botella, se supone que debe poder deshabilitar el almacenamiento en caché de plantillas llamando al bottle.debug(True)
.
Sin embargo, Jinja parece estar almacenando sus plantillas en caché. Creo que esto se debe a la forma en que está escrito el adaptador jinja2 de la botella (solo usa un cargador Jinja2 predeterminado y no expone muchas opciones de configuración).
Tras la Jinja2 Docs, he escrito este cargador personalizado que yo esperaría para desencadenar una plantilla cada vez que vuelva a cargar, pero no parece funcionar bien:
import settings
from bottle import jinja2_template
from bottle import Jinja2Template, template as base_template
class AutoreloadJinja2Template(Jinja2Template):
def loader(self, name):
def uptodate():
# Always reload the template if we're in DEVMODE (a boolean flag)
return not settings.DEVMODE
fname = self.search(name, self.lookup)
if fname:
with open(fname, "rb") as f:
source = f.read().decode(self.encoding)
return (source, fname, uptodate)
template = functools.partial(base_template,
template_adapter=AutoreloadJinja2Template,
template_lookup = settings.TEMPLATE_PATHS,
template_settings={
'auto_reload': settings.DEVMODE
}
)
plantillas todavía se están guardados hasta que reinicie dev_appserver. Este debe ser un problema bastante común. ¿Alguien tiene una solución que funciona?
ACTUALIZACIÓN:
que terminé haciendo algo como:
class CustomJinja2Template(Jinja2Template):
if settings.DEVMODE:
def prepare(self, *args, **kwargs):
kwargs.update({'cache_size':0})
return Jinja2Template.prepare(self, *args, **kwargs)
template = functools.partial(original_template, template_adapter=CustomJinja2Template)
Esto hace que las plantillas para recargar siempre, pero sólo si un módulo de Python ha sido tocado. es decir, si solo edita un archivo de plantilla, los cambios no tendrán efecto hasta que edite uno de los archivos de Python que lo importa. Parece que las plantillas todavía se almacenan en caché en algún lugar.
Downarrowing porque el argumento cache_size = 0 no me funcionaba usando el decorador view() o la función template(). También ejecutar (reloader = True) arroja un error: "variable local 'lockfile' referenciado antes de la asignación" – arkanciscan
@arkanciscan este error probablemente no está relacionado con mi respuestaq, pero está bien. Solo para su conocimiento, informé de su comentario como un problema para embotellar (https://github.com/defnull/bottle/issues/278). ¿Puedes dar más detalles sobre el error en github? ¿Qué adaptador de servidor estás usando? ¡Gracias! – iurisilvio
+1 para el informe de error, gracias :) – defnull