Uso i modelli Jinja2 con Bottle.py e dev_appserver di Google App Engine per lo sviluppo. Voglio che i modelli si ricarichino automaticamente su ogni richiesta (o idealmente solo quando cambiano), in modo che non debba continuare a riavviare il server.Qual è il modo migliore per disattivare il caching del modello Jinja2 in bottle.py?
In base ai documenti del flacone, si suppone che si possa disabilitare il caching del modello chiamando lo bottle.debug(True)
.
Jinja sembra ancora che memorizzi i suoi modelli nella cache. Credo che ciò sia dovuto al modo in cui viene scritto l'adattatore jinja2 per bottiglia (utilizza solo un caricatore Jinja2 predefinito e non espone molte opzioni di configurazione).
Dopo la Jinja2 Docs, ho scritto questo Loader personalizzato che mi aspetterei per innescare un modello di ricaricare ogni volta, ma non sembra funzionare sia:
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
}
)
I modelli sono ancora sempre memorizzati nella cache fino a quando ho riavviare dev_appserver. Questo deve essere un problema abbastanza comune. Qualcuno ha una soluzione che funziona?
UPDATE:
ho finito per fare qualcosa di simile:
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)
Questo fa sì che i modelli di ricaricare sempre, ma solo se un modulo Python è stato toccato. Ad esempio, se si modifica un file modello, le modifiche non avranno effetto finché non si modifica uno dei file Python che lo importa. Sembra che i modelli siano ancora memorizzati nella cache da qualche parte.
Downarrowing perché l'argomento cache_size = 0 non ha funzionato con me utilizzando la funzione view() decorator o template(). Esegui anche (reloader = True) genera un errore: "variabile locale 'lockfile' referenziato prima dell'assegnazione" – arkanciscan
@arkanciscan questo errore probabilmente non è correlato al mio responseq, ma va bene. Solo per tua conoscenza, ho segnalato il tuo commento come un problema da imbottigliare (https://github.com/defnull/bottle/issues/278). Puoi fornire maggiori dettagli sul bug in github? Quale adattatore server stai usando? Grazie! – iurisilvio
+1 per il bug report, grazie :) – defnull