Primeros pasos con Jinja y FastAPI
Un motor de plantillas es un recurso utilizado para separar la lógica de presentación de los datos. Mediante impresiones, filtros, condicionales, ciclos o importaciones, permite generar código HTML necesario para representar una página web. Son muy empleados en la programación del lado del servidor, ya que permiten la presentación de datos sin tener que modificar el código fuente.
En pocas palabras, con un motor de plantillas es posible presentar los datos manejados por el servidor, específicamente FastApi y generar el HTML en el proceso; por ejemplo, si tenemos una lista de usuarios, podemos imprimirlo en una tabla o similar en HTML usando ciertas funcionalidades (directivas).
Sobre Jinja
Jinja es un motor de plantillas escrito en Python diseñado para ser simple y expresivo; Jinja es el motor de plantillas usado en otros frameworks web de Python, como lo es Flask, también es muy similar al empleado por Django.
Con Jinja como motor de plantilla podemos representar fácilmente las respuestas de la API.
El motor de plantillas de Jinja utiliza corchetes { } para distinguir sus expresiones y sintaxis del HTML:
- La sintaxis {{ }} se denomina bloque variable y la podemos usar para imprimir en la plantilla.
- La sintaxis {% %} alberga estructuras de control como if/else, bucles y macros.
- La sintaxis {# #} son para comentarios.
Uso de Jinja en FastAPI
En este apartado, veremos cómo instalar Jinja dos en un proyecto en FastAPI y distintos ejemplos de cómo podemos emplear en conjunto ambas tecnologías para crear una aplicación web que no solamente permitirá procesar peticiones en el servidor y devolver una respuesta en formato JSON, si no, también procesar peticiones para devolver como respuestas páginas HTML con las cuales podremos gestionar datos.
Instalar Jinja
Para instalar el motor de plantillas conocido como Jinja, ejecutamos en el proyecto:
$ pip install Jinja2
Para utilizar Jinja, crearemos una carpeta para almacenar los templates:
templates
Y un apartado para las tareas:
templates\task
Y un archivo HTML:
templates\task\index.html
Con el siguiente contenido:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FastAPI</title>
</head>
<body>
<h1>Hello world</h1>
</body>
</html>
En el archivo de arranque, crearemos un objeto instancia de Jinja2Templates que recibe como parámetro la carpeta raíz de los templates:
api.py
from fastapi import Request
from fastapi.templating import Jinja2Templates
templates = Jinja2Templates(directory="templates/")
Y creamos una función que recibe como parámetro la ubicación de la plantilla a renderizar y la petición del usuario:
@app.get('/page')
def index(request: Request):
return templates.TemplateResponse('task/index.html',{"request": request})
Si accedemos desde el navegador, veremos:
Hello world