<jupyter_start><jupyter_text>[![img/pythonista.png](img/pythonista.png)](https://www.pythonista.io)  Introducción a *Jinja*. El contenido que entrega una función de vista es procesado y enviado por *Flask* con el encabezado:```Content-Type: text/html; charset=UTF-8``` Por lo que el cliente interpretará la respuesta como un documento *HTML*.*Flask* es capaz de entregar contenido *HTML* a partir de plantillas capaces de procesar objetos de *Python* que son pasados dentro de un contexto.   El lenguaje de plantillas *Jinja*. [*Jinja*](https://jinja.palletsprojects.com) es un lenguaje de plantillas (*templates*) el cual permite insertar y procesar objetos de *Python* dentro de un documento de texto. *Jinja* puede procesar cualquier documento de texto en formatos como *XML*, *HTML*, *YAML*, *JSON*, etc.*Jinja* no sólo es utilizado por *Flask*. Algunos otros proyectos como [*Ansible*](https://www.ansible.com/) lo utilizan para crear *playbooks*.https://jinja.palletsprojects.com/en/3.0.x/templates/<jupyter_code>import jinja2<jupyter_output><empty_output><jupyter_text>El lenguaje de plantillas de *Jinja*.*Jinja* ejecuta las expresiones y declaraciones que se encuentran encerrados entre signos de llaves "```{```" "```}```".  Declaraciones.Las declaraciones deben estar encerradas entre signos de porcentajes "```%```".**Sintaxis:**```{%  %} ```  Expresiones.Las declaraciones deben estar encerradas entre llaves nuevamente "```{```" "```}```".**Sintaxis:**```{{  }} ```  Comentarios.Las declaraciones deben estar encerradas entre signos de gato "``````".**Sintaxis:**```{  } ```  La clase ```jinja2.Template```. La clase ```jinja2.Template``` permite instanciar objetos capaces de procesar plantillas y su contexto.```jinja2.Template()```Donde:* ``````es un objeto ```str``` que contiene texto y código de *Jinja*.Para fines de claridad, los objetos instanciados de la clase ```jinja2.Template``` serán referidos como ```template```. **Ejemplo:**<jupyter_code>template = jinja2.Template("Hola, {{nombre}}.")<jupyter_output><empty_output><jupyter_text>El método ```template.render()```.Este método interpereta el código de *Jinja* insertado en la plantilla contenida en el objeto ```template```. Una vez que se ejecuta el código de la plantilla, el método y regresa la cadena de texto resultante.```template.render()```Donde:* `````` es una sucesión de pares ``` =``` separados por comas. Dichos pares crearán un espacio de nombre que será utilizado por *Jinja*. **Ejemplo:**<jupyter_code>template = jinja2.Template("Hola,{{nombre}}.\nEres socio {{nivel}}.")
template.render(nombre="Juan", nivel="Premier")
print(template.render(nombre="Juan", nivel="Premier"))<jupyter_output><empty_output><jupyter_text>Lectura de plantillas a partir de archivos.La clase ```jinja.Template``` puede gestionar objetos de texto. Sin embargo, el verdadero potencial de *Jinja* está en el consumo de documentos de texto.  La clase ```jinja2.FileSystemLoader```.La clase ```jinja2.FileSystemLoader``` permite definir los parámetros necesarios para acceder a un sistema  de archivos, definiendo una o varias rutas en las que se encontrarán las plantillas.Sintaxis:```jinja2.FileSystemLoader('')ojinja2.FileSystemLoader(['', '', ..., ''])```  La clase ```jinja2.Environment```.La clase ```jinja2.Environment``` permite definir la configuración de diversas propiedades de *Jinja*.**Sintaxis:**```jinja2.Environment(loader = , )```Donde:* ```loader``` es un objeto instanciado de la clase  ```jinja2.FileSystemLoader```.  Carga de plantillas.  El objeto instanciado de la clase ```jinja2.Environment``` contiene al  método ```get_template()```, el cual permite acceder a una archivo cuyo nombre o ruta relativa se ingresa como parámetro.*Jinja* buscará el archivo desde las rutas definidas previamente.**Sintaxis:**```.get_template('') ```El resultado es un objeto ```template```. **Ejemplo:** * Las siguientes celdas asignarán la ruta de esta *notebook* al nombre ```miruta```.<jupyter_code>import os
os.getcwd()
miruta = os.getcwd()<jupyter_output><empty_output><jupyter_text>* La siguiente celda definirá la carpeta [```templates```](templates) como la ruta en la que se encuentran las plantillas a utilizar.<jupyter_code>entorno = jinja2.Environment(loader=jinja2.FileSystemLoader(miruta + '/templates'))<jupyter_output><empty_output><jupyter_text>* La siguiente celda cargará el archivo [```templates/plantilla.html```](templates/plantilla.html)<jupyter_code>template = entorno.get_template("plantilla.html")
ligas = [['slashdot', 'https://slashdot.org'], 
         ['pythonista', 'https://www.pythonista.io'], 
         ['cloudevel', 'https://www.cloudevel.com'],
         ['google', 'https://google.com/search?q=pythoinsta']]
print(template.render(lista=ligas))
from IPython.display import HTML
HTML(template.render(lista=ligas))<jupyter_output><empty_output><jupyter_text>*Flask* y *Jinja*.*Jinja* viene incluido en la instalación base de *Flask* y cuenta con la función ```flask.render_template()``` para la gestión de plantillas. *Flask* está configurado para buscar los archivos de plantilla en la carpeta ```templates``` localizada en el directorio desde el que se ejecuta el objeto ```app```. **Ejemplo:** * L plantilla [```templates/plantilla.html```](templates/plantilla.html) es un documento de texto que incluye código *HTML* y código de *Jinja*:``` html    Bienvenidos    Listado de referencias      {% for nombre, liga in lista %}    {{ nombre.capitalize() }}   {% endfor %}   ``` **Advertencia:** Una vez ejecutada la siguiente celda, es necesario interrumpir el *kernel* de *Jupyter* para poder ejecutar el resto de las celdas de la *notebook*.<jupyter_code>from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def inicio():
    
    ligas = [['slashdot', 'https://slashdot.org'], 
         ['pythonista', 'https://pythonista.io'], 
         ['cloudevel', 'https://cloudevel.com']]
    
    return render_template('plantilla.html', lista=ligas)

#Si no se define el parámetro host, flask sólo será visible desde localhost
app.run(host='0.0.0.0')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1473236208872156, 'fraction_numerical': 0.004092322802422655, 'mean_word_length': 5.9195922989807475, 'pattern_counts': {'":': 0, '<': 29, '<?xml version=': 0, '>': 29, 'https://': 11, 'lorem ipsum': 0, 'www.': 4, 'xml': 0}, 'pii_count': 1, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '403438', 'license': 'MIT', 'n_tokens_mistral': 2093, 'n_tokens_neox': 2014, 'n_words': 591, 'path': '04_introduccion_a_jinja.ipynb', 'repo_name': 'PythonistaMX/py231', 'size': '6109'}