2010-11-18 5 views
3

J'essaie de changer le modèle Jinja2 dans l'application django sans redémarrer l'application.Comment forcer les modèles Jinja2 à se recompiler?

Quelqu'un at-il fait cela? Fondamentalement, j'ai besoin de forcer jinja2 à recharger les modèles une fois le changement de sélection de peau appliqué.

J'ai essayé de recréer l'objet de cache sur l'objet de l'environnement de modèle sans effet.

myskin_utils.py:

from jinja2.environment import create_cache 
ENV_OBJECT.cache = create_cache(50) 

J'ai aussi essayé de recharger le module qui contient mon ENV_OBJECT avec

reload(myskin) #also no effect on the output 

Une autre chose que je voudrais changer à la volée est la langue, mais je suppose que c'est une question distincte.

Merci pour tout conseil.

modifier: Je n'ai pas cache configuré avec jinja2, mais je ne vois un Accélérez d'utiliser Jinja après le passage de modèles Django, je pense que le bytecode modèle réside dans le code compilé de mes fonctions de vue mais Je n'ai pas regardé les détails de Jinja.

Je ENV (une instance de CoffinEnvironment qui Jinja de Environment sous-classes) importées dans l'espace de noms global d'un module d'affichage et appelle ENV.get_template() fonctions à l'intérieur de vue (+ Django Coffin + jinja2).

Constaté que si je l'appelle reload() de python sur builtin mon module d'environnement au sein la fonction de vue du modèle ne se allume, mais je ne voudrais pas coller ce code dans toutes les fonctions.

Répondre

4

Par défaut Jinja2 n'utilise pas de cache du tout, mais il est recommandé de configurer un back-end de mise en cache pour accélérer les choses un peu. Ainsi, jinja2 n'a pas besoin d'analyser et de compiler chaque modèle à chaque requête. Jinja2 supporte actuellement 2 types de caches différents:

L'un d'entre eux est FileSystemBytecodeCache qui est (comme son nom l'indique) basé sur un fichier. Ainsi, tous les modèles compilés sont stockés sur le système de fichiers et récupérés à partir de là. Si vous regardez attentivement l'implémentation, vous y trouverez également une méthode cache.clear() qui supprime simplement tous les fichiers de ce dossier temporaire. Faire en sorte que tous les modèles soient à nouveau analysés/compilés.

L'autre type de cache est appelé MemcachedBytecodeCache qui est juste une enveloppe mince pour Memcache. Cette méthode est recommandée, car Memcache stocke tout en mémoire, donc c'est un peu plus rapide que de frapper le disque, et vous pouvez utiliser le même cache depuis différents hôtes (ce qui est utile si vous utilisez un type de cluster).

Le client Memcache sous-jacent (werkzeug.contrib.cache, python-memcached ou cmemcache) fournit également une méthode clear() qui supprime tout ce qui se trouve dans le cache. Mais parce que vous utilisez probablement le cache pour d'autres choses (par exemple stocker le résultat de requêtes de base de données coûteuses là), la méthode clear() n'est pas exposée dans jinja, car elle affectera tout (et pas seulement les modèles).

Donc, pour résumer vos options:

  • Utilisez Jinja2 sans cache
  • Utilisation Jinja2 avec un FileSystemBytecodeCache et appelez cache.clear()
  • Utilisez Jinja2 avec un MemcachedBytecodeCache et appelez memcache_client.clear() (qui effacera également tout le reste dans le cache).
  • Exécutez un processus memcached distinct sur un autre port uniquement utilisé avec Jinja2. Puis appelez memcache_client.clear() et tous les modèles seront effacés.
+0

Merci! Je n'ai pas de cache configuré pour Jinja2. Pensez-vous que je serai plus rapide dans mon environnement si je le fais? Ma compréhension est que mon modèle bytecode est déjà en mémoire, est-ce exact ou pas? Merci encore! – Evgeny

+6

Je crois que cette réponse est fausse - selon [this] (http://jinja.pocoo.org/docs/api/#bytecode-cache), le cache bytecode n'est utilisé que lors de la première exécution, pas à chaque requête. Comme pour le rechargement automatique des modèles modifiés, il y a l'option 'auto_reload' [ici] (http://jinja.pocoo.org/docs/api/#jinja2.Environment). Je ne sais pas si c'était la même chose en novembre 2010, c'est pourquoi je ne déprécie pas cette réponse. –

0

Ceci est faux. Jinja utilise un LRUCache dans le cache mémoire par défaut, de cache_size (paramètre Environment). Vous pouvez également utiliser un cache disque pour effectuer des redémarrages ultérieurs du préformant de l'application (aucune recompilation nécessaire).

Questions connexes