python - examples - ¿Cómo uso las plantillas de Django sin el resto de Django?
documentacion de django (13)
¿Alguna razón en particular por la que quieres usar las plantillas de Django? Tanto Jinja como Genshi son, en mi opinión, superiores.
Si realmente lo desea, consulte la documentación de Django en settings.py
. Especialmente en la sección "Usar la configuración sin configurar DJANGO_SETTINGS_MODULE
". Usa algo como esto:
from django.conf import settings
settings.configure (FOO=''bar'') # Your settings go here
Quiero usar el motor de plantillas de Django en mi código (Python), pero no estoy construyendo un sitio web basado en Django. ¿Cómo lo uso sin tener un archivo settings.py (y otros) y tener que establecer 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.
De acuerdo con la documentación de Jinja, el soporte de 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. Debe configurar explícitamente los settings.DEBUG
configuración.DEBUG, que es el motor de plantillas predeterminado que proporciona 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"
Encontró esto:
Google AppEngine
Engine usa el motor de plantillas de Django. ¿Has mirado cómo lo hacen? Podrías simplemente usar eso.
Gracias por ayudar a la gente. Aquí hay una adición más. El caso donde necesita usar etiquetas de plantilla personalizadas.
Supongamos que tiene esta etiqueta de plantilla importante 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 una secuencia de comandos de Python que se vinculará a todos juntos
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'': ''.com rox''})
template = get_template("temp.html")
# Prepare context ....
print template.render(c)
El resultado sería
{.com rox}
La solución es simple. En realidad está bien documentado , pero no es tan fácil de encontrar. (Tuve que investigar, no apareció cuando intenté algunas búsquedas de Google diferentes).
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 anteriormente) para obtener una descripción de algunas de las configuraciones que quiera definir (como argumentos de palabras clave para configurar).
Me hago eco de las declaraciones anteriores. Jinja 2 es un muy buen superconjunto 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 hacerlo bien para ti.
Mientras se ejecuta el shell manage.py
:
>>> from django import template
>>> t = template.Template(''My name is {{ me }}.'')
>>> c = template.Context({''me'': ''ShuJi''})
>>> t.render(c)
No lo hagas Use StringTemplate en StringTemplate lugar; no hay ninguna razón para considerar cualquier otro motor de plantilla una vez que lo sepa.
Una adición a lo que escribió otro, si desea utilizar la Plantilla Django en Django> 1.7, debe dar su configuración. Configure (...) llame a la variable TEMPLATES y llame 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 puede cargar su 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 escribió la variable DIRS en .configure, desde el disco:
from django.template.loader import get_template
t = get_template(''a.html'')
t.render({''name'': 5})
Error de Django: no se configuró ningún back-end de DjangoTemplates
http://django.readthedocs.io/en/latest/releases/1.7.html#standalone-scripts
Yo diría Jinja también. Definitivamente es más poderoso que Django Templating Engine y es independiente .
Si se trataba de un complemento externo a una aplicación Django existente, podría crear un comando personalizado y utilizar el motor de plantillas en el entorno de proyectos. Me gusta esto;
manage.py generatereports --format=html
Pero no creo que valga la pena usar el motor de plantillas Django en lugar de Jinja.
Yo también recomendaría jinja2. Hay un buen artículo sobre django
vs. jinja2
que brinda información detallada sobre por qué debería preferir el último.
Jinja2 syntax Jinja2 es más o menos la misma que la de Django con muy pocas diferencias, y obtienes un motor de plantillas mucho más poderoso, que también compila tu plantilla en código de bytes (¡RÁPIDO!).
Lo uso para plantillas, incluso en Django, y es muy bueno. También puede escribir fácilmente extensiones si falta alguna característica que desee.
Aquí hay alguna 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''