Instalar y configurar Jinja2 en Django

Instalar y configurar Jinja2 en Django
Escrito 3 years ago

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.

Instalar Jinja2

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.

Instalar Jinja2 en nuestro entorno de trabajo
1
$ pip3 install jinja2

Este comando instalará el paquete Jinja2 en nuestro sistema o entorno virtual.

NOTA:

Para que el comando funcione debéis tener instalado el gestor de repositorios pip. También que es recomendable instalar todos los paquetes que vayamos a utilizar, incluido Django, dentro de un entorno virtual. Para instalar el pip y configurar Django en un entorno virtual puedes ver la siguiente entrada: Instalar Django

Configurar Jinja2 en Django

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.

Variable de configuración TEMPLATES
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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 [ci]templates[/ci]. Es importante tener esta opción siempre a [ci]True[/ci] 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éis 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.

Podeis obtener más información en la página oficial de Django: Variable de configuración TEMPLATES y Configurar gestor de plantillas

¿Como organiza Django los gestores de plantilla?[

Como veis, 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.

  1. Accede a la variable de configuración TEMPLATES y escoge el primer gestor de plantillas de la lista.

  2. Busca la plantilla en el primer directorio 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.

  3. Si no encuentra la plantilla en ninguno de los directorios 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

  4. Si la subcarpeta 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.

  5. Si no encuentra la plantilla en ningún sitio, lanza una excepción, indicando que la plantilla no existe.

Configurar environment para Jinja2

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 [ci]jinja2.py[/ci]. Aquí añadiremos algunas funciones importantes de Django para que se puedan usar dentro de una plantilla.

Archivo jinja2.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
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:

  • reverse. Esta se llamará url dentro de Jinja2.

  • staticfiles_storage.url. LLamada static dentro de las plantillas.

Enlazar nuestra función de configuración inicial con Jinja2

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.

Diferencias entre generador de plantillas Django y Jinja2

Ya hemos visto como se instala Jinja2, bastante sencillo. Lo único que queda por recordar es que aunque ambos lenguajes de plantilla son muy parecidos, existen ciertas diferencias gramaticales y de funciones y filtros que debéis de conocer. Los cambios más importante son sobretodo en las funciones y filtros que usan ambos, porque tienen nombres distintos. Para más información os dejo un enlace con ambas gramáticas:

TL;DR Resumiendo

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.

  1. Instalar jinja2 con el comando $ pip3 install jinja2.

  2. Modificar la variable de configuración de Django TEMPLATES.

  3. Crear el archivo de configuración inicial de Jinja2.

  4. Vincular nuestro archivo anterior de configuración inicial con la variable TEMPLATES, usando la opción environment.

En posteriores entradas veremos algunos aspectos de las sintaxis de Jinja2 y como añadir filtros otras funciones personalizadas a Jinja2 para que las podamos usar en las plantillas.

Comentarios