¿Cómo uso las plantillas de Django sin el resto de Django?
-
01-07-2019 - |
Pregunta
Quiero usar el motor de plantillas Django en mi código (Python), pero no estoy creando un sitio web basado en Django.¿Cómo lo uso sin tener un archivo settings.py (y otros) y tener que configurar la variable de entorno DJANGO_SETTINGS_MODULE?
Si ejecuto el siguiente código:
>>> import django.template
>>> from django.template import Template, Context
>>> t = Template('My name is {{ my_name }}.')
Yo obtengo:
ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.
Solución
La solución es sencilla.en realidad es bien documentada, pero no demasiado fácil de encontrar.(Tuve que buscar más; no apareció cuando intenté algunas búsquedas diferentes en Google).
El siguiente código funciona:
>>> 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.'
Consulte la documentación de Django (vinculada arriba) para obtener una descripción de algunas de las configuraciones que quizás desee definir (como argumentos de palabras clave para configurar).
Otros consejos
Jinja2 sintaxis es prácticamente igual que el de Django con muy pocas diferencias, y obtienes un motor de plantillas mucho más potente, que también compila tu plantilla en código de bytes (¡RÁPIDO!).
Lo uso para crear plantillas, incluso en el propio Django, y es muy bueno.También puede escribir extensiones fácilmente si falta alguna característica que desee.
Aquí hay una demostración de la generación de código:
>>> 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'
¿Alguna razón particular por la que quieras usar las plantillas de Django?Ambos Jinja y Genshi son, en mi opinión, superiores.
Si realmente quieres, entonces mira el Documentación de Django sobre settings.py
.Especialmente la sección "Usar configuraciones sin configurar DJANGO_SETTINGS_MODULE
".Utilice algo como esto:
from django.conf import settings
settings.configure (FOO='bar') # Your settings go here
También recomendaría jinja2.Hay un Buen articulo en django
vs. jinja2
eso brinda información detallada sobre por qué debería preferir lo último.
Según la documentación de Jinja, La compatibilidad con Python 3 aún es experimental.Entonces, si está en Python 3 y el rendimiento no es un problema, puede usar el motor de plantillas integrado de Django.
Django 1.8 introdujo soporte para múltiples motores de plantillas lo que requiere un cambio en la forma en que se inicializan las plantillas.Tienes que configurar explícitamente settings.DEBUG
que es utilizado por el motor de plantillas predeterminado proporcionado por Django.Aquí está el código para usar plantillas sin usar el resto 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"
yo diría Jinja también.Definitivamente es mas poderoso que Django Templating Engine y es ser único.
Si se tratara de un complemento externo para una aplicación Django existente, podría crear un comando personalizado y utilice el motor de plantillas dentro del entorno de sus proyectos.Como esto;
manage.py generatereports --format=html
Pero no creo que valga la pena usar Django Templating Engine en lugar de Jinja.
Gracias por la ayuda amigos.Aquí hay una adición más.El caso en el que necesita utilizar etiquetas de plantilla personalizadas.
Digamos que tienes esta importante etiqueta de plantilla en el módulo read.py
from django import template
register = template.Library()
@register.filter(name='bracewrap')
def bracewrap(value):
return "{" + value + "}"
Este es el archivo de plantilla html "temp.html":
{{var|bracewrap}}
Finalmente, aquí hay un script de Python que los vinculará a todos.
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 salida sería
{stackoverflow.com rox}
Encontró esto:
No.Usar Plantilla de cadena en cambio, no hay razón para considerar ningún otro motor de plantillas una vez que lo conozca.
Además de lo que otros escribieron, si desea utilizar la plantilla Django en Django > 1.7, debe darle a su settings.configure(...) llamar a la variable TEMPLATES y llamar a django.setup() de esta manera:
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()
Luego puedes cargar tu plantilla como normalmente, desde una cadena:
from django import template
t = template.Template('My name is {{ name }}.')
c = template.Context({'name': 'Rob'})
t.render(c)
Y si escribiste la variable DIRS en el .configure, desde el disco:
from django.template.loader import get_template
t = get_template('a.html')
t.render({'name': 5})
Error de Django:No hay ningún backend de DjangoTemplates configurado
http://django.readthedocs.io/en/latest/releases/1.7.html#standalone-scripts
Me hago eco de las declaraciones anteriores.Jinja 2 es un superconjunto bastante bueno de plantillas de Django para uso general.Creo que están trabajando para hacer que las plantillas de Django estén un poco menos acopladas a settings.py, pero Jinja debería funcionar bien para ti.
Mientras ejecuta el manage.py
caparazón:
>>> from django import template
>>> t = template.Template('My name is {{ me }}.')
>>> c = template.Context({'me': 'ShuJi'})
>>> t.render(c)
Google AppEngine
utiliza el motor de plantillas Django, ¿has visto cómo lo hacen?Posiblemente podrías usar eso.