Je souhaite utiliser le moteur de modèle Django dans mon code (Python), mais je ne crée pas de site Web basé sur Django. Comment l'utiliser sans avoir de fichier settings.py ( et autres) et avoir à définir la variable d'environnement Django_SETTINGS_MODULE?
Si j'exécute le code suivant:
>>> import Django.template
>>> from Django.template import Template, Context
>>> t = Template('My name is {{ my_name }}.')
Je reçois:
ImportError: Settings cannot be imported, because environment variable Django_SETTINGS_MODULE is undefined.
La solution est simple. C'est en fait bien documenté , mais pas trop facile à trouver. (J'ai dû fouiller - cela ne s'est pas produit lorsque j'ai essayé quelques recherches Google différentes.)
Le code suivant fonctionne:
>>> from Django.template import Template, Context
>>> from Django.conf import settings
>>> settings.configure()
>>> t = Template('My name is {{ my_name }}.')
>>> c = Context({'my_name': 'Daryl Spitzer'})
>>> t.render(c)
u'My name is Daryl Spitzer.'
Voir la documentation Django (liée ci-dessus) pour une description de certains des paramètres que vous voudrez peut-être définir (comme arguments de mot-clé à configurer).
Jinja2syntaxe est à peu près la même chose que Django avec très peu de différences, et vous obtenez un moteur de modèle beaucoup plus puissant, qui compile également votre modèle en bytecode (FAST!).
Je l'utilise pour les modèles, y compris dans Django lui-même, et c'est très bon. Vous pouvez également facilement écrire des extensions si certaines fonctionnalités que vous voulez manquent.
Voici une démonstration de la génération de code:
>>> import jinja2
>>> print jinja2.Environment().compile('{% for row in data %}{{ row.name | upper }}{% endfor %}', raw=True)
from __future__ import division
from jinja2.runtime import LoopContext, Context, TemplateReference, Macro, Markup, TemplateRuntimeError, missing, concat, escape, markup_join, unicode_join
name = None
def root(context, environment=environment):
l_data = context.resolve('data')
t_1 = environment.filters['upper']
if 0: yield None
for l_row in l_data:
if 0: yield None
yield unicode(t_1(environment.getattr(l_row, 'name')))
blocks = {}
debug_info = '1=9'
Une raison particulière pour laquelle vous souhaitez utiliser les modèles de Django? Jinja et Genshi sont, à mon avis, supérieurs.
Si vous le souhaitez, consultez la documentation Django sur settings.py
. Surtout la section "Utilisation des paramètres sans définir Django_SETTINGS_MODULE
". Utilisez quelque chose comme ceci:
from Django.conf import settings
settings.configure (FOO='bar') # Your settings go here
Je recommanderais également jinja2. Il y a Nice article on Django
vs. jinja2
qui donne des informations détaillées sur les raisons pour lesquelles vous devriez préférer la version ultérieure.
Selon la documentation de Jinja, le support de Python 3 est encore expérimental . Donc, si vous êtes sur Python 3 et que les performances ne sont pas un problème, vous pouvez utiliser le moteur de modèle intégré de Django.
Django 1.8 a introduit la prise en charge de moteurs de modèles multiples qui nécessite une modification de la façon dont les modèles sont initialisés. Vous devez configurer explicitement settings.DEBUG
qui est utilisé par le moteur de modèle par défaut fourni par Django. Voici le code pour utiliser des modèles sans utiliser le reste de Django.
from Django.template import Template, Context
from Django.template.engine import Engine
from Django.conf import settings
settings.configure(DEBUG=False)
template_string = "Hello {{ name }}"
template = Template(template_string, engine=Engine())
context = Context({"name": "world"})
output = template.render(context) #"hello world"
Merci pour votre aide. Voici encore un ajout. Le cas où vous devez utiliser des balises de modèle personnalisées.
Disons que vous avez cette balise de modèle importante dans le module read.py
from Django import template
register = template.Library()
@register.filter(name='bracewrap')
def bracewrap(value):
return "{" + value + "}"
Voici le fichier de modèle html "temp.html":
{{var|bracewrap}}
Enfin, voici un script Python qui se liera à tous ensemble
import Django
from Django.conf import settings
from Django.template import Template, Context
import os
#load your tags
from Django.template.loader import get_template
Django.template.base.add_to_builtins("read")
# You need to configure Django a bit
settings.configure(
TEMPLATE_DIRS=(os.path.dirname(os.path.realpath(__file__)), ),
)
#or it could be in python
#t = Template('My name is {{ my_name }}.')
c = Context({'var': 'stackoverflow.com rox'})
template = get_template("temp.html")
# Prepare context ....
print template.render(c)
La sortie serait
{stackoverflow.com rox}
Je dirais aussi Jinja . Il est certainement plus puissant que Django Templating Engine et il est autonome .
S'il s'agissait d'un plugin externe vers une application Django existante, vous pouvez créer ne commande personnalisée et utiliser le moteur de création de modèles dans l'environnement de votre projet. Comme ceci;
manage.py generatereports --format=html
Mais je ne pense pas que cela vaille la peine d'utiliser le Django Templating Engine au lieu de Jinja.
Non. Utilisez plutôt StringTemplate - il n'y a aucune raison d'envisager un autre moteur de modèle une fois que vous en avez connaissance.
Trouvé ceci:
En plus de ce que d'autres ont écrit, si vous souhaitez utiliser Django Template on Django> 1.7, vous devez donner votre appel settings.configure (...) la variable TEMPLATES et appelez Django.setup () comme ceci:
from Django.conf import settings
settings.configure(TEMPLATES=[
{
'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
'DIRS': ['.'], # if you want the templates from a file
'APP_DIRS': False, # we have no apps
},
])
import Django
django.setup()
Ensuite, vous pouvez charger votre modèle comme d'habitude, à partir d'une chaîne:
from Django import template
t = template.Template('My name is {{ name }}.')
c = template.Context({'name': 'Rob'})
t.render(c)
Et si vous avez écrit la variable DIRS dans le .configure, à partir du disque:
from Django.template.loader import get_template
t = get_template('a.html')
t.render({'name': 5})
Erreur Django: aucun backend DjangoTemplates n'est configuré
http://Django.readthedocs.io/en/latest/releases/1.7.html#standalone-scripts
Lors de l'exécution de manage.py
Coquille:
>>> from Django import template
>>> t = template.Template('My name is {{ me }}.')
>>> c = template.Context({'me': 'ShuJi'})
>>> t.render(c)
Google AppEngine
utilise le moteur Django modèle, avez-vous regardé comment ils le font? Vous pouvez peut-être simplement l'utiliser.
Je fais écho aux déclarations ci-dessus. Jinja 2 est un assez bon ensemble de modèles Django pour une utilisation générale. Je pense qu'ils travaillent à rendre les modèles Django un peu moins couplés aux paramètres .py, mais Jinja devrait bien faire pour vous.