Flask: Blueprints
Descubre cómo estructurar grandes proyectos en Flask usando Blueprints. Divide tu aplicación en módulos independientes, mantiene el código ordenado y facilita la colaboración en equipos de desarrollo de Python.
Aprende Flask GRATIS y certifícateEn Flask, los Blueprints permiten dividir la aplicación en diferentes secciones o módulos para facilitar la organización del proyecto. Esta aproximación es esencial cuando la aplicación crece y se precisan estructuras más definidas para la gestión de rutas, controladores y funcionalidades.
Qué son los Blueprints en Flask
Los Blueprints son objetos que actúan como componentes de una aplicación de Flask. En lugar de crear todas las rutas directamente en un único archivo, cada módulo (o conjunto de funcionalidades) se encarga de definir sus propias rutas en un blueprint. Posteriormente, el blueprint se registra en la aplicación principal, integrando sus rutas y configuraciones de forma centralizada.
Beneficios de utilizar Blueprints
- Modularidad: Cada blueprint concentra las rutas y recursos específicos de un dominio, permitiendo un mejor aislamiento del código.
- Escalabilidad: Distribuir la aplicación en múltiples módulos facilita el crecimiento de proyectos de tamaño medio o grande.
- Mantenibilidad: Con un diseño modular, resulta más sencillo ubicar y modificar funcionalidades, y cada equipo puede trabajar sobre secciones concretas del proyecto.
- Reutilización: Es factible replicar o reutilizar un mismo blueprint en distintos proyectos sin necesidad de reescribir las mismas rutas y lógica.
Creación de un Blueprint
Para definir un Blueprint, se importa la clase Blueprint
del paquete flask
. A continuación, se especifican los endpoints o rutas que pertenecerán a ese blueprint. Por ejemplo, creamos el archivo usuario_controller.py
en la carpeta controllers/
:
# controllers/usuario_controller.py
from flask import Blueprint, request, jsonify
usuario_bp = Blueprint('usuario_bp', __name__)
@usuario_bp.route('/usuarios', methods=['GET'])
def listar_usuarios():
# Lógica para obtener y devolver la lista de usuarios
return jsonify({"usuarios": []})
@usuario_bp.route('/usuarios', methods=['POST'])
def crear_usuario():
datos = request.get_json()
# Lógica para crear un usuario con los datos recibidos
return jsonify({"mensaje": "Usuario creado"}), 201
En este ejemplo, se han definido dos rutas bajo el blueprint usuario_bp
. La función listar_usuarios
maneja solicitudes GET para /usuarios
, mientras que crear_usuario
recibe datos por POST en la misma ruta.
Registro del Blueprint en la aplicación principal
Una vez definido el blueprint, se integra con la aplicación Flask. En el archivo principal (por ejemplo, app.py
), se registra:
# app.py
from flask import Flask
from controllers.usuario_controller import usuario_bp
app = Flask(__name__)
# Registro del blueprint
app.register_blueprint(usuario_bp)
if __name__ == '__main__':
app.run(debug=True)
Al ejecutar este archivo, Flask incluye las rutas definidas en usuario_bp
y las expone en la URL correspondiente.
Uso de prefijos en las rutas
Para evitar conflictos y organizar mejor los endpoints, es común asignar un prefijo al blueprint durante su registro. Esto permite que todas las rutas incluidas en un mismo módulo compartan una sección de la URL. En el ejemplo anterior:
app.register_blueprint(usuario_bp, url_prefix='/api')
Así, las rutas /usuarios
pasarán a estar bajo /api/usuarios
, indicando que se trata de endpoints de la API. Esto agiliza la interpretación de las diferentes rutas que componen el proyecto.
Multiplicidad de Blueprints
Al crecer la aplicación, se pueden crear múltiples blueprints para cada tipo de recurso o funcionalidad. Por ejemplo, si tu proyecto contempla la gestión de productos, clientes y pedidos, cada uno puede tener su archivo de controlador y sus propias rutas:
controllers/
├── usuario_controller.py (usuario_bp)
├── producto_controller.py (producto_bp)
└── pedido_controller.py (pedido_bp)
Cada uno se registra con un prefijo adecuado en el app.py
:
app.register_blueprint(usuario_bp, url_prefix='/api/usuarios')
app.register_blueprint(producto_bp, url_prefix='/api/productos')
app.register_blueprint(pedido_bp, url_prefix='/api/pedidos')
De esta manera, el código se mantiene segmentado y claro, con un blueprint dedicado a cada dominio del negocio.
Organizar plantillas y recursos estáticos con Blueprints
Si tu blueprint requiere plantillas (en casos donde se gestionan vistas HTML) o archivos estáticos, se pueden especificar rutas adicionales al crearlo:
usuario_bp = Blueprint(
'usuario_bp',
__name__,
template_folder='templates/usuario',
static_folder='static/usuario'
)
- template_folder: Indica la carpeta donde se ubican los archivos
.html
que necesita el blueprint. - static_folder: Define la carpeta de archivos estáticos específicos para ese módulo.
Esto facilita la separación de recursos cuando se manejan múltiples partes de la aplicación, cada una con su propia interfaz web.
Interconexión entre Blueprints
A veces, un blueprint puede requerir datos o rutas de otro. Para ello, se pueden realizar importaciones y usar helpers o servicios compartidos. La comunicación debe mantenerse lo más clara posible, evitando dependencias cíclicas. Se recomienda centralizar funciones de uso común en módulos de utilidades.
Buenas prácticas con Blueprints
- Agrupar lógica relacionada en un mismo blueprint, en lugar de mezclar funcionalidades muy distintas.
- Mantener cada blueprint en un archivo o directorio separado, con un nombre significativo.
- Usar prefijos que distingan los dominios de la aplicación con rutas claras.
- Registrar todos los blueprints en el archivo principal, para disponer de una visión global de los módulos integrados.
Ejemplo de arquitectura completa
Con un proyecto de cierto tamaño, la estructura podría lucir así:
mi_proyecto/
├── app.py
├── controllers/
│ ├── usuario_controller.py
│ ├── producto_controller.py
│ └── pedido_controller.py
├── models/
│ ├── usuario.py
│ ├── producto.py
│ └── pedido.py
├── templates/
│ ├── usuario/
│ ├── producto/
│ └── pedido/
└── static/
├── usuario/
├── producto/
└── pedido/
- Cada controlador define su blueprint y gestiona la parte de negocio y rutas relacionadas.
- Cada modelo describe la parte de la base de datos para esa entidad.
- Las plantillas y archivos estáticos también se separan por módulos si la aplicación requiere vistas HTML.
La adopción de Blueprints aporta modularidad y escalabilidad a aplicaciones Flask en Python, convirtiéndose en una práctica imprescindible para proyectos que necesitan un orden más complejo. Gracias a esta organización, cada componente puede crecer de forma independiente, lo que se traduce en una arquitectura más limpia, mantenible y sencilla de extender en el futuro.
Lecciones de este módulo de Flask
Lecciones de programación del módulo Blueprints del curso de Flask.
Ejercicios de programación en este módulo de Flask
Evalúa tus conocimientos en Blueprints con ejercicios de programación Blueprints de tipo Test, Puzzle, Código y Proyecto con VSCode.