Flask
Tutorial Flask: Sintaxis de plantillas Jinja 2 en Flask
Aprende a usar variables y estructuras en Jinja2 para generar contenido dinámico en Flask. Maneja condicionantes e iterativos para mejorar tu aplicación.
Aprende Flask GRATIS y certifícateUso de variables y expresiones en plantillas
Las plantillas de Jinja2 permiten generar contenido dinámico en aplicaciones Flask mediante el uso de variables y expresiones. Para utilizar variables en una plantilla, primero debes pasarlas desde la función de vista en Flask y luego emplearlas dentro de la plantilla utilizando la sintaxis adecuada.
En la función de vista, las variables se pasan a la plantilla mediante el método render_template
. Por ejemplo:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def inicio():
usuario = "Ana"
return render_template('inicio.html', nombre_usuario=usuario)
En este ejemplo, la variable usuario
se pasa a la plantilla inicio.html
con el nombre nombre_usuario
.
Dentro de la plantilla, accedes a las variables utilizando la sintaxis de doble llave {{ }}
:
<!DOCTYPE html>
<html>
<head>
<title>Página de Inicio</title>
</head>
<body>
<h1>Bienvenida, {{ nombre_usuario }}!</h1>
</body>
</html>
Esto mostrará "Bienvenida, Ana!" cuando la plantilla sea renderizada.
Las expresiones en Jinja2 permiten manipular y presentar las variables de diversas maneras. Por ejemplo, puedes aplicar filtros para modificar el formato de una variable. Si deseas mostrar el nombre del usuario en mayúsculas, puedes usar el filtro upper
:
<h1>Bienvenida, {{ nombre_usuario|upper }}!</h1>
Además de filtros, puedes realizar operaciones aritméticas directamente en la plantilla:
{% set precio = 100 %}
<p>Precio original: {{ precio }} euros</p>
<p>Precio con descuento: {{ precio * 0.9 }} euros</p>
En este caso, se calcula el 10% de descuento sobre el precio original.
También es posible utilizar expresiones lógicas para mostrar contenido basado en condiciones:
{% set stock = 0 %}
<p>{{ "Producto disponible" if stock > 0 else "Producto agotado" }}</p>
Las posibilidades al usar variables y expresiones en las plantillas son extensas, lo que permite crear contenido altamente dinámico y personalizado en función de las necesidades de tu aplicación.
Estructuras de control condicional
Las estructuras de control condicional en las plantillas de Jinja2 permiten modificar el contenido renderizado según condiciones específicas. Utilizando las sentencias if
, elif
y else
, puedes controlar qué partes de la plantilla se muestran al usuario basándote en variables y expresiones lógicas.
La sintaxis básica para una condición es:
{% if condición %}
<!-- Contenido si la condición es verdadera -->
{% elif otra_condición %}
<!-- Contenido si la otra condición es verdadera -->
{% else %}
<!-- Contenido si ninguna condición anterior es verdadera -->
{% endif %}
Por ejemplo, si desde la vista en Flask pasas una variable usuario
, puedes utilizar una estructura condicional para personalizar el saludo:
@app.route('/')
def inicio():
usuario = {'nombre': 'Carlos', 'autenticado': True}
return render_template('inicio.html', usuario=usuario)
En la plantilla inicio.html
, podrías escribir:
<!DOCTYPE html>
<html>
<head>
<title>Página de Inicio</title>
</head>
<body>
{% if usuario.autenticado %}
<h1>Bienvenido, {{ usuario.nombre }}!</h1>
{% else %}
<h1>Bienvenido, invitado!</h1>
{% endif %}
</body>
</html>
Si usuario.autenticado
es verdadero, se mostrará "Bienvenido, Carlos!"; de lo contrario, "Bienvenido, invitado!".
Las condiciones pueden combinar operadores de comparación y lógicos para crear expresiones más complejas:
{% if edad >= 18 and pais == 'España' %}
<p>Eres mayor de edad en España.</p>
{% else %}
<p>No cumples los requisitos.</p>
{% endif %}
Aquí se verifica si la variable edad
es mayor o igual a 18 y si pais
es "España". Dependiendo del resultado, se muestra un mensaje diferente.
Es posible anidar estructuras condicionales para manejar múltiples escenarios:
{% if producto.stock > 0 %}
<p>Producto disponible.</p>
{% if producto.stock < 10 %}
<p>¡Quedan pocas unidades!</p>
{% endif %}
{% else %}
<p>Producto agotado.</p>
{% endif %}
Si producto.stock
es positivo, se informa que el producto está disponible. Si además el stock es menor a 10, se muestra un aviso adicional.
Las estructuras condicionales admiten diversas operaciones:
- Comparaciones:
==
,!=
,>
,<
,>=
,<=
- Operadores lógicos:
and
,or
,not
- Pertenencia:
in
,not in
- Identidad:
is
,is not
Por ejemplo, para verificar si un usuario tiene un rol específico:
{% if 'admin' in usuario.roles %}
<p>Tienes permisos de administrador.</p>
{% elif 'moderador' in usuario.roles %}
<p>Eres moderador del sitio.</p>
{% else %}
<p>Acceso limitado.</p>
{% endif %}
Recuerda que los bloques de control en Jinja2 comienzan con {% %}
y las sentencias de control deben finalizarse con {% endif %}
para evitar errores de sintaxis.
También puedes usar expresiones condicionales en línea para simplificar el código:
<p>{{ "Activo" if usuario.activo else "Inactivo" }}</p>
Esta expresión muestra "Activo" si usuario.activo
es verdadero, o "Inactivo" en caso contrario.
Las estructuras de control condicional son esenciales para crear plantillas más dinámicas y adaptadas al contexto, mejorando la interacción con el usuario y la flexibilidad de la aplicación.
Estructuras de control iterativo
Las estructuras de control iterativo en las plantillas de Jinja2 permiten procesar y mostrar colecciones de datos de manera dinámica. La sentencia for
es la principal forma de iterar sobre secuencias como listas, tuplas y diccionarios, facilitando la generación de contenido repetitivo en las páginas web.
La sintaxis básica de un bucle for
en Jinja2 es:
{% for elemento in secuencia %}
<!-- Contenido a repetir -->
{% endfor %}
Por ejemplo, si desde la función de vista en Flask pasamos una lista de productos:
@app.route('/productos')
def mostrar_productos():
productos = ['Manzanas', 'Naranjas', 'Peras', 'Plátanos']
return render_template('productos.html', lista_productos=productos)
En la plantilla productos.html
, podemos iterar sobre lista_productos
para mostrar cada ítem:
<!DOCTYPE html>
<html>
<head>
<title>Lista de Productos</title>
</head>
<body>
<h1>Productos disponibles</h1>
<ul>
{% for producto in lista_productos %}
<li>{{ producto }}</li>
{% endfor %}
</ul>
</body>
</html>
Este código generará una lista no ordenada con cada producto como un elemento de la lista.
Las iteraciones pueden ser más complejas cuando trabajamos con listas de diccionarios u objetos. Si tenemos una lista de diccionarios con información detallada:
@app.route('/productos')
def mostrar_productos():
productos = [
{'nombre': 'Manzanas', 'precio': 1.5, 'stock': 50},
{'nombre': 'Naranjas', 'precio': 2.0, 'stock': 30},
{'nombre': 'Peras', 'precio': 1.75, 'stock': 20},
{'nombre': 'Plátanos', 'precio': 1.25, 'stock': 100}
]
return render_template('productos.html', lista_productos=productos)
En la plantilla, accedemos a los campos de cada producto:
<!DOCTYPE html>
<html>
<head>
<title>Lista de Productos</title>
</head>
<body>
<h1>Productos disponibles</h1>
<table>
<tr>
<th>Nombre</th>
<th>Precio (€)</th>
<th>Stock</th>
</tr>
{% for producto in lista_productos %}
<tr>
<td>{{ producto.nombre }}</td>
<td>{{ producto.precio }}</td>
<td>{{ producto.stock }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
Aquí se crea una tabla con los detalles de cada producto.
Jinja2 proporciona una variable especial llamada loop
dentro de las estructuras iterativas. Esta variable de control ofrece información útil sobre el estado de la iteración:
loop.index
: número entero que empieza en 1 y aumenta en cada iteración.loop.index0
: igual queloop.index
pero comienza en 0.loop.revindex
: cuenta regresiva desde el tamaño de la secuencia hasta 1.loop.revindex0
: cuenta regresiva desde el tamaño de la secuencia menos 1 hasta 0.loop.first
: Verdadero si es la primera iteración.loop.last
: Verdadero si es la última iteración.loop.length
: longitud total de la secuencia.loop.cycle
: función que permite alternar valores en cada iteración.
Un ejemplo del uso de loop.index
:
{% for producto in lista_productos %}
<p>Producto {{ loop.index }}: {{ producto.nombre }}</p>
{% endfor %}
Si deseas aplicar estilos alternos a las filas de una tabla, puedes utilizar loop.cycle
:
<table>
{% for producto in lista_productos %}
<tr class="{{ loop.cycle('par', 'impar') }}">
<td>{{ producto.nombre }}</td>
<td>{{ producto.precio }}</td>
</tr>
{% endfor %}
</table>
En este caso, las clases CSS 'par' e 'impar' se asignan alternativamente a cada fila.
También es posible anidar bucles para iterar sobre estructuras más complejas. Si tienes una lista de categorías, cada una con sus productos:
@app.route('/catalogo')
def mostrar_catalogo():
catalogo = {
'Frutas': ['Manzanas', 'Naranjas', 'Plátanos'],
'Verduras': ['Lechuga', 'Tomate', 'Zanahoria'],
'Lácteos': ['Leche', 'Queso', 'Yogur']
}
return render_template('catalogo.html', catalogo=catalogo)
En la plantilla, iteras sobre el diccionario y luego sobre las listas internas:
<!DOCTYPE html>
<html>
<head>
<title>Catálogo de Productos</title>
</head>
<body>
<h1>Catálogo de Productos</h1>
{% for categoria, productos in catalogo.items() %}
<h2>{{ categoria }}</h2>
<ul>
{% for producto in productos %}
<li>{{ producto }}</li>
{% endfor %}
</ul>
{% endfor %}
</body>
</html>
Si necesitas controlar el flujo dentro del bucle, puedes utilizar la sentencia continue
para saltar a la siguiente iteración o break
para salir del bucle. Sin embargo, es recomendable manejar estas condiciones antes de la iteración cuando sea posible, ya que Jinja2 es más limitado que Python en este aspecto.
Por ejemplo, para omitir productos sin stock:
{% for producto in lista_productos %}
{% if producto.stock == 0 %}
{% continue %}
{% endif %}
<p>{{ producto.nombre }} está disponible.</p>
{% endfor %}
Es importante utilizar las estructuras de control iterativo de manera eficiente para generar contenido dinámico y mantener las plantillas claras y mantenibles. Aprovecha las funcionalidades que ofrece Jinja2 para simplificar la presentación de datos en tus aplicaciones Flask.
Herencia de plantillas y bloques
La herencia de plantillas en Jinja2 es una característica fundamental que permite crear aplicaciones Flask más organizadas y mantenibles. Mediante el uso de bloques y plantillas base, es posible definir una estructura común para múltiples páginas, facilitando la reutilización de código y la consistencia en el diseño.
Para comenzar, se crea una plantilla base que establece el esqueleto de las páginas, incluyendo elementos comunes como el encabezado, el pie de página y el diseño general. Un ejemplo de plantilla base llamada base.html
sería:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>{% block titulo %}Título por Defecto{% endblock %}</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/estilos.css') }}">
</head>
<body>
<header>
<h1>{% block encabezado %}Mi Sitio Web{% endblock %}</h1>
<nav>
<ul>
<li><a href="{{ url_for('inicio') }}">Inicio</a></li>
<li><a href="{{ url_for('contacto') }}">Contacto</a></li>
</ul>
</nav>
</header>
<main>
{% block contenido %}
<p>Contenido por defecto.</p>
{% endblock %}
</main>
<footer>
{% block pie %}
<p>© 2024 Mi Sitio Web</p>
{% endblock %}
</footer>
</body>
</html>
En esta plantilla se han definido varios bloques utilizando la sintaxis {% block nombre_bloque %}{% endblock %}
. Los bloques titulo
, encabezado
, contenido
y pie
permiten que las plantillas hijas puedan sobrescribir estas secciones con contenido específico.
Para crear una plantilla que extienda base.html
, se utiliza la sentencia {% extends 'base.html' %}
al inicio del archivo. Por ejemplo, en pagina.html
:
{% extends 'base.html' %}
{% block titulo %}Página de Ejemplo{% endblock %}
{% block contenido %}
<h2>Bienvenido a la Página de Ejemplo</h2>
<p>Este es el contenido específico de esta página.</p>
{% endblock %}
En este caso, la plantilla pagina.html
hereda la estructura y estilos de base.html
y proporciona contenido personalizado para los bloques titulo
y contenido
. Esto permite mantener una consistencia en el diseño mientras se adapta el contenido a cada página.
Los bloques son esenciales para definir qué partes de la plantilla pueden ser modificadas por las plantillas hijas. Si un bloque no es sobrescrito, se utiliza el contenido definido en la plantilla base. Por ejemplo, si no se define el bloque pie
en la plantilla hija, se mostrará el pie de página por defecto de base.html
.
Es posible utilizar la función super()
dentro de un bloque para incluir el contenido original del bloque en la plantilla base y agregar contenido adicional. Por ejemplo:
{% block contenido %}
{{ super() }}
<p>Además, ofrecemos servicios personalizados.</p>
{% endblock %}
Aquí, {{ super() }}
inserta el contenido del bloque contenido
de base.html
, y luego se añade un párrafo adicional. Esto es útil para extender el contenido sin reemplazarlo completamente.
La herencia de plantillas también permite anidar bloques y crear estructuras más complejas. Por ejemplo, podrías tener una sección lateral en tu sitio web:
<main>
<section class="principal">
{% block contenido %}{% endblock %}
</section>
<aside>
{% block lateral %}
<p>Enlaces relacionados:</p>
<ul>
<li><a href="#">Enlace 1</a></li>
<li><a href="#">Enlace 2</a></li>
</ul>
{% endblock %}
</aside>
</main>
En la plantilla hija, puedes sobrescribir el bloque lateral
si deseas cambiar o eliminar la barra lateral:
{% block lateral %}
{{ super() }}
<p>Contenido adicional en la barra lateral.</p>
{% endblock %}
Además de sobrescribir bloques, también puedes agregar bloques adicionales en la plantilla base para permitir más personalización en las plantillas hijas. Esto proporciona flexibilidad y facilita el mantenimiento del código.
La herencia de plantillas se integra perfectamente con las rutas de Flask. Al renderizar una plantilla hija, Flask utiliza automáticamente la estructura definida en las plantillas base. Por ejemplo:
from flask import render_template
@app.route('/')
def inicio():
return render_template('pagina.html')
Es importante destacar que la organización de los archivos de plantilla es clave. Se recomienda colocar todas las plantillas en un directorio llamado templates
y utilizar subdirectorios si es necesario para mantener un orden lógico.
La herencia múltiple de plantillas es posible, permitiendo que una plantilla extienda otra que a su vez extiende una tercera. Sin embargo, es fundamental mantener un diseño claro para evitar confusiones. Por ejemplo:
base.html
: plantilla base con la estructura general.seccion_base.html
: extiendebase.html
y define bloques comunes para una sección específica del sitio.pagina.html
: extiendeseccion_base.html
y proporciona contenido específico.
Al utilizar la herencia de esta manera, se puede crear una jerarquía lógica y mantener una coherencia en todo el sitio web.
La inclusión de plantillas con {% include 'archivo.html' %}
también es útil para insertar fragmentos de código reutilizables, como un formulario de inicio de sesión o un componente de pie de página. Por ejemplo:
{% include 'formularios/login.html' %}
Este enfoque es ideal para componentes pequeños y evita la necesidad de crear bloques específicos.
Para finalizar, la herencia de plantillas y bloques es una práctica esencial en el desarrollo con Flask y Jinja2. Permite crear aplicaciones más modulares y facilita la colaboración entre desarrolladores, ya que cada uno puede trabajar en diferentes plantillas sin interferir con la estructura general.
Es recomendable planificar la arquitectura de las plantillas desde el inicio del proyecto, identificando los elementos comunes y definiendo los bloques necesarios. De esta forma, podrás crear un sistema de plantillas eficiente y escalable que se adapte a las necesidades de tu aplicación.
Agregar Bootstrap 5 a Jinja Flask
Bootstrap 5 es un framework de CSS que facilita el diseño de interfaces web responsivas y atractivas. Integrar Bootstrap 5 en una aplicación Flask permite desarrollar interfaces de usuario más rápidamente y con un estilo profesional. A continuación, se muestra cómo agregar Bootstrap 5 a las plantillas Jinja en una aplicación Flask.
Primero, es recomendable incluir Bootstrap 5 mediante un CDN (Content Delivery Network), lo que simplifica el proceso sin necesidad de descargar archivos adicionales. En la plantilla base de tu aplicación, puedes incluir los enlaces al CSS y JavaScript de Bootstrap 5.
Supongamos que tienes una plantilla base llamada base.html
que otras plantillas extienden. En esta plantilla, en el bloque <head>
, agrega el enlace al CSS de Bootstrap 5:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>{% block titulo %}{% endblock %}</title>
<!-- Enlace al CSS de Bootstrap 5 -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-..." crossorigin="anonymous">
</head>
<body>
{% block contenido %}{% endblock %}
<!-- Enlace al JavaScript de Bootstrap 5 -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-..." crossorigin="anonymous"></script>
</body>
</html>
Es importante incluir el enlace al CSS de Bootstrap en la sección <head>
y el enlace al JavaScript al final del <body>
. De esta forma, se asegura que los componentes interactivos de Bootstrap funcionen correctamente.
Si tu aplicación Flask sirve archivos estáticos desde una carpeta llamada static
, también puedes descargar los archivos de Bootstrap 5 y colocarlos allí. Sin embargo, utilizar el CDN es más simple y garantiza que siempre estés usando la versión más actualizada.
Con Bootstrap 5 incluido, puedes empezar a utilizar sus clases y componentes en tus plantillas Jinja. Por ejemplo, para crear una barra de navegación, puedes escribir en tu plantilla:
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="{{ url_for('inicio') }}">Mi Sitio Web</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Alternar navegación">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="{{ url_for('inicio') }}">Inicio</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ url_for('contacto') }}">Contacto</a>
</li>
</ul>
</div>
</div>
</nav>
En este ejemplo, se utiliza el componente navbar de Bootstrap para crear una barra de navegación responsiva. Las clases de Bootstrap facilitan el diseño sin tener que escribir CSS personalizado.
Para aplicar estilos a los botones, puedes utilizar las clases de Bootstrap en los elementos <button>
o <a>
. Por ejemplo:
<a href="{{ url_for('registro') }}" class="btn btn-primary">Regístrate</a>
Esto creará un botón con el estilo primario de Bootstrap.
Asimismo, puedes estructurar el contenido utilizando el sistema de rejillas de Bootstrap. Por ejemplo, para crear una disposición de columnas:
<div class="container">
<div class="row">
<div class="col-md-6">
<h2>Columna 1</h2>
<p>Contenido de la primera columna.</p>
</div>
<div class="col-md-6">
<h2>Columna 2</h2>
<p>Contenido de la segunda columna.</p>
</div>
</div>
</div>
Esto divide el contenido en dos columnas en pantallas medianas y más grandes, gracias a las clases col-md-6
.
En tus plantillas Jinja, puedes combinar la lógica de Flask con las clases de Bootstrap. Por ejemplo, si deseas mostrar mensajes de alerta basados en alguna condición:
{% if mensaje %}
<div class="alert alert-success" role="alert">
{{ mensaje }}
</div>
{% endif %}
Aquí, se utiliza el componente alerta de Bootstrap para mostrar mensajes al usuario.
Además, Bootstrap 5 ofrece una amplia variedad de componentes como formularios, tablas, modales y más. Por ejemplo, para diseñar un formulario de registro:
<form method="post" action="{{ url_for('registrar') }}">
<div class="mb-3">
<label for="inputNombre" class="form-label">Nombre</label>
<input type="text" class="form-control" id="inputNombre" name="nombre" required>
</div>
<div class="mb-3">
<label for="inputEmail" class="form-label">Correo electrónico</label>
<input type="email" class="form-control" id="inputEmail" name="email" required>
</div>
<div class="mb-3">
<label for="inputContraseña" class="form-label">Contraseña</label>
<input type="password" class="form-control" id="inputContraseña" name="contraseña" required>
</div>
<button type="submit" class="btn btn-primary">Registrar</button>
</form>
Este formulario utiliza las clases de Bootstrap para darle un estilo coherente y profesional.
Si necesitas personalizar aún más tus estilos, puedes agregar tu propio archivo CSS y combinarlo con Bootstrap. En la plantilla base, después de incluir el CSS de Bootstrap, añade tu hoja de estilos:
<link rel="stylesheet" href="{{ url_for('static', filename='css/estilos.css') }}">
De esta forma, puedes sobreescribir estilos predeterminados o agregar nuevos.
Cuando trabajas con iconos, puedes integrar Bootstrap Icons, que es un conjunto de iconos oficial de Bootstrap. Al igual que con Bootstrap, puedes incluirlos mediante un CDN:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.9.1/font/bootstrap-icons.css">
Y utilizarlos en tus plantillas:
<i class="bi bi-alarm-fill"></i>
Esta etiqueta insertará el icono de una alarma.
Recuerda que al usar Jinja con Flask, las variables de contexto y las rutas se manejan igual que en los ejemplos anteriores. Por ejemplo, al crear enlaces, utiliza url_for
para generar las URL dinámicamente.
Otro aspecto importante al agregar Bootstrap 5 es asegurar que tus plantillas sean responsivas. Bootstrap está diseñado para adaptarse a diferentes tamaños de pantalla, lo que garantiza que tu aplicación se vea bien en dispositivos móviles y de escritorio.
Para organizar mejor tus plantillas y componentes, puedes crear macros en Jinja. Por ejemplo, si tienes un componente que utilizas frecuentemente, como una tarjeta de producto, puedes definir una macro:
{% macro tarjeta_producto(producto) %}
<div class="card" style="width: 18rem;">
<img src="{{ producto.imagen_url }}" class="card-img-top" alt="{{ producto.nombre }}">
<div class="card-body">
<h5 class="card-title">{{ producto.nombre }}</h5>
<p class="card-text">{{ producto.descripcion }}</p>
<a href="{{ url_for('producto_detalle', id=producto.id) }}" class="btn btn-primary">Ver más</a>
</div>
</div>
{% endmacro %}
Y luego utilizarla en tus plantillas:
{% for producto in productos %}
{{ tarjeta_producto(producto) }}
{% endfor %}
Esto reduce la repetición de código y mantiene las plantillas más limpias.
Integrar Bootstrap 5 en tus plantillas Jinja de Flask mejora significativamente la apariencia y usabilidad de tu aplicación, permitiéndote enfocarte en la lógica de negocio mientras aprovechas un potente framework de estilos.
Todas las lecciones de Flask
Accede a todas las lecciones de Flask y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Flask
Introducción Y Entorno
Instalación Y Configuración Flask Con Venv
Introducción Y Entorno
Mysql Con Sqlalchemy En Flask
Modelos Y Migraciones
Tipos De Datos En Modelos
Modelos Y Migraciones
Operaciones Crud Y Consultas
Modelos Y Migraciones
Asociaciones De Modelos
Modelos Y Migraciones
Migraciones Con Flask-migrate
Modelos Y Migraciones
Rutas Endpoints Rest Get
Api Rest
Respuestas Con Esquemas Flask Marshmallow
Api Rest
Rutas Endpoints Rest Post, Put Y Delete
Api Rest
Manejo De Errores Y Códigos De Estado Http
Api Rest
Autenticación Jwt Con Flask-jwt-extended
Api Rest
Controlador Mvc Con Métodos Get En Flask
Mvc
Sintaxis De Plantillas Jinja 2 En Flask
Mvc
Controlador Mvc Con Métodos Post En Flask
Mvc
Inclusión De Archivos Estáticos En Jinja
Mvc
Validación De Formularios Con Wtforms
Mvc
Subir Archivos En Formularios Jinja En Flask
Mvc
Autenticación Con Flask-login
Mvc
Autorización Con Flask-principal
Mvc
Qué Son Los Blueprints Y Cómo Crear Uno
Blueprints
Integrar Openai Api En Flask Api Rest
Aplicación Con Ia
Sqlalchemy Orm En Flask Mysql
Aplicación Con Ia
Resultados De Ia Con Jinja En Flask
Aplicación Con Ia
En esta lección
Objetivos de aprendizaje de esta lección
- Implementar variables en plantillas Jinja2.
- Utilizar expresiones y filtros para manipular datos.
- Aplicar estructuras condicionales para personalizar contenido.
- Implementar bucles iterativos para mostrar colecciones de datos.
- Comprender la herencia de plantillas para mejorar la modularidad y consistencia.