En esta entrada vamos a configurar nuestro proyecto en Django para que utilice el generador de plantillas Jinja2. Pero, ¿Por qué utilizar un Jinja2 cuando Django ya tiene uno propio?. La respuesta es sencilla, Jinja2 es más rápido que el generador de plantillas de Django y consume una memoria similar a este. Esto es una gran ventaja cuando tu sitio web tiene miles de visitas. Si a esto le sumamos que la sintaxis es muy parecida a la de Django, pero con funcionalidades añadidas, la decisión de escoger Jinja2 con respecto al generador tradicional se vuelve muy interesante.
En esta entrada vamos a ver como configurar Django para que utilice Jinja2 como su motor de plantillas. Lo primero hay que saber es que Jinja2 funciona con una versión de Django >= 1.8
y con las versiones de Python >= 2.6
y >= 3.3
. Ahora que conocemos lo requisitos para instalar Jinja2, accedemos a la consola de nuestro sistema operativo y ejecutamos el siguiente comando, para instalar Jinja2.
pip3 install jinja2
Este comando instalará el paquete Jinja2 en nuestro sistema o entorno virtual.
Ahora que todo está instalado, nos creamos una carpeta, donde guardaremos nuestras plantillas de Jinja2, abrimos el archivo settings.py
de nuestro proyecto y modificamos una variable llamada TEMPLATES
. Esta variable, permite configurar los gestores de plantillas que usaremos en nuestro proyecto.
TEMPLATES = [
# Parte que hay que añadir para configurar Jinja2 en nuestro proyecto en Django
# Esta es la parte que debemos añadir a la variable TEMPLATES.
# Es recomendable ponerla antes que la opción por defecto.
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [
'ruta de la carpeta donde se guardarán las plantillas para jinja2',
'ruta a otra carpeta con plantillas para Jinja2'
],
'APP_DIRS': True,
'OPTIONS': {
'environment': 'paquete.nuestra.funcion.enviorement',
'auto_reload': DEBUG,
'autoescape': True
},
},
# Gestor de plantillas por defecto en Django.
# Es importante mantenerlo, porque se utiliza para renderizar las plantillas que vienen en Django.
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
La variable TEMPLATES
es una lista, donde cada elemento es un diccionario con los datos de configuración de nuestro gestor de plantillas:
BACKEND
Esta es la clase que abstrae nuestro código en Django para poder usar el gestor de plantillas de forma transparente. Por decirlo de alguna manera es el "puente" que enlaza nuestro proyecto y el gestor de plantillas. Para Jinja2 la clase que utilizaremos es django.template.backends.jinja2.Jinja2
DIRS
Lista con los directorios donde se guardarán las plantillas que vamos analizar con el gestor de plantillas. Si Django no encuentra la plantilla en la primera carpeta de la lista, entonces busca en la siguiente carpeta y así hasta que encuentre la plantilla o hasta que registre todo los directorios.
APP_DIRS
Esta opción está pensada para las aplicaciones externas que se instalan en Django, porque permite buscar plantillas dentro de la carpeta de la aplicación, en una subcarpeta llamada templates. Es importante tener esta opción siempre a True ya que sino, algunas aplicaciones de Django no funcionarán de manera correcta.
Por ejemplo el panel de administración de nuestra página web. Este es una aplicación llamada django.contrib.admin
que se encuentra en el directorio ruta_a_la_libreria_de_django/contrib/admin
. Verá que dentro de esta carpeta hay una llamada templates
. Esta contiene las plantillas del panel de administración que utiliza Django.
OPTIONS
Es un diccionario con las opciones de configuración de nuestro gestor de plantillas. Cada gestor de plantillas tiene su propio conjunto de opciones. En caso de Jinja2, las opciones son:
environment
Ruta hacia una función que añadirá filtros y funciones propias a la sintaxis de Jinja2. Más adelante veremos como crearla, ya que es muy recomendable añadir algunas funciones de Django a la sintaxis de Jinja2.auto_reload
Indica si la plantilla se analiza cada vez que se refresca la página True
o se guarda en caché una vez analizada False
. El valor de esta opción suele ser DEBUG
, porque cuando estamos creando la página y DEBUG = True
es necesario que la plantilla se analice cada vez que carguemos una página. Así podemos ver los cambios que hemos realizado en nuestra plantilla. Pero cuando el sitio web está en modo producción y DEBUG = False
, nos interesa guardar la plantilla analizada en una caché, así la página web se carga más rápido y nuestro servidor consume menos memoria.Autoescape
Si la variable es True
, escapa de forma automática todo los caracteres html de las variables de Jinja. Es importante poner esta opción siempre a True
para evitar que nos hagan Inyección html en nuestro sitio web.Como ves, en la variable de configuración TEMPLATES
, tenemos 2 gestores de plantillas, ¿cual utiliza Django?, pues todos los que haya instalados, en este caso 2. La forma que tiene Django de escoger un gestor y una plantilla es la siguiente.
TEMPLATES
y escoge el primer gestor de plantillas de la lista.DIRS
del gestor de plantillas. Si encuentra la plantilla, genial, ejecuta la plantilla con el gestor seleccionado. Si no pasa al siguiente directorio de la lista.DIRS
y tenemos la opción APP_DIRS = True
, entonces busca dentro de la carpeta de la aplicación externa, en la subcarpeta ¡ templates
templates
] no existe, o no encuentra la plantilla dentro, escoge el siguiente gestor de plantillas de la lista TEMPLATES
y repite el proceso desde el paso 2.El siguiente paso es crear un archivo en la carpeta principal de nuestro proyecto de Django, se puede llamar llamar como queráis, en el ejemplo le vamos a llamar jinja2.py. Aquí añadiremos algunas funciones importantes de Django para que se puedan usar dentro de una plantilla.
from __future__ import absolute_import # Solo si usas python 2
from django.contrib.staticfiles.storage import staticfiles_storage
from django.core.urlresolvers import reverse
from jinja2 import Environment
def ini_jinja2(**options):
env = Environment(**options)
env.globals.update({
'static': staticfiles_storage.url,
'url': reverse,
})
return env
El archivo consta de una función principal, en este caso la he llamado ini_jinja2
, la cual recibe el parámetro **options
, que contiene las opciones de configuración inicial de Jinja2. Pero lo importante es la variable env
, que es un objeto de la clase Environment
, que es la clase principal que inicia el gestor de plantillas. Esta objeto debe ser retornado siempre por la función.
En el código también se ve el método env.globasl.update()
, que sirve para añadir funciones y variables a todas las plantillas de JInja2 que se ejecuten. El método recibe como parámetro un diccionario. Las claves de los elementos del diccionario son los nombres que tendrán las funciones o variables dentro de las plantillas de Jinja2. Los valores de los elementos del diccionario son las propias variables o funciones.
Django recomienda añadir 2 funciones, las cuales vienen ya definida, en generador de plantillas tradicional de Django, pero no en Jinja. Las funciones son:
url
dentro de Jinja2. staticfiles_storage.url
. LLamada static
dentro de las plantillas.Ya, como último paso, solo queda modificar nuestra opción environment
, de la variable de configuración TEMPLATES
, para que apunte a la función ini_jinja2
en el archivo jinja2.py
que acabamos de crear. En este ejemplo sería: nuestroproyecto.jinja2.ini_jinja
. Con esto ya está todo listo para usar Jinja2 en nuestro proyecto de Django.
Jinja2 es un excelente gestor de plantillas rápido y diseñado para funcionar con Django de forma nativa, sin tener que añadir ningún paquete extra o modificar parte de nuestro código ya creado. Su instalación resulta fácil. Resumiendo los puntos anteriores sería:
$ pip3 install jinja2
.TEMPLATES
.TEMPLATES
, usando la opción environment
.Saludos!!
Fuente: Buhoprogramador.com
Saludos,
me gusto el articulo aunque falta un poco mas para que me sea util pues tratando de implementar estos pasos en un proyecto que ya tengo no me fue posible hacerlo funcionar. de echo revisando bien no veo que considere jinja2 como una de los motores con los cuales revisar las plantillas.
mas alla de esta configuración quisiera saber 2 cosas:
¿tengo que tener plantillas terminación .jinja para que funcione?
¿tengo que ademas llamar de manera particular en mi funcion render la plantilla de jinja? por ejemplo:
render(request=request, template_name=‘tienda/index.jinja’, context=context_home())
Muchas Gracias Excelente aporte