4

Instalar y configurar Jinja2 en Django

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.


pip3 install jinja2


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


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.


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 organiza Django los gestores de plantilla?


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.

<ol>
  • Accede a la variable de configuración TEMPLATES y escoge el primer gestor de plantillas de la lista.
  • 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.
  • 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
  • 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.
  • Si no encuentra la plantilla en ningún sitio, lanza una excepción, indicando que la plantilla no existe.
  • </ol>


    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 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:


    • 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.


    Conclusión


    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:


    <ol>
  • Instalar jinja2 con el comando $ pip3 install jinja2.
  • Modificar la variable de configuración de Django TEMPLATES.
  • Crear el archivo de configuración inicial de Jinja2.
  • Vincular nuestro archivo anterior de configuración inicial con la variable TEMPLATES, usando la opción environment.
  • </ol>


    Saludos!!


    Fuente: Buhoprogramador.com

    Escribe tu comentario
    + 2
    1
    4Puntos
    3 años

    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())