Blueprints en Flask

Publicado por Andrea Navarro en

En este artículo veremos cómo utilizar Blueprints para modularizar nuestras aplicaciones Flask para hacerlas fácilmente escalables. También veremos como utilizarlos para gestionar los recursos de cada módulo.

El micro-framework Flask tiene entre sus principales características la flexibilidad con respecto al diseño de arquitectura de sus aplicaciones. No existe una estructura estipulada ya que se busca que cada desarrollador genere aquella que se ajuste mejor al tipo y tamaño de proyecto.

Para el caso de proyectos complejos que buscan escalabilidad y modularidad como parte de su estructura, Flask provee Blueprints. Esta herramienta asiste a la creación de componentes reutilizables agrupando funcionalidades del sistema y aislando sus diferentes recursos.

Blueprints

En Flask, un Blueprint es un objeto que permite definir rutas, templates y recursos estáticos de forma modular. Cada Blueprint funciona como un subconjunto o módulo de una aplicación Flask. La asociación de cada módulo con sus correspondientes recursos permite mayor escalabilidad de la aplicación y facilita el mantenimiento de la misma.

Algunos beneficios de utilizar Blueprint en una aplicación Flask son:

  • Modularización: En lugar de contar con una aplicación con funcionalidades y recursos centralizados, los Blueprints permiten dividirla en componentes más pequeños y reutilizables. Cada Blueprint puede representar una sección lógica o funcional de la aplicación, como autenticación, administración, usuarios, etc.
  • Organización del Código: Al separar un proyecto en Blueprints, estos se organizan en carpetas con diferentes rutas, archivos y recursos, mejorando la estructura del código y facilitando su posterior mantenimiento.
  • Reutilización de Código: Los Blueprints permiten reutilizar componentes en diferentes partes de la aplicación, evitando así la repetición.
  • Trabajo colaborativo: Separar las diferentes funcionalidad de la aplicación con Blueprints permite que múltiples desarrolladores puedan trabajar de forma paralela e independiente en diferentes módulos sin interferencia.
  • Escalabilidad: El uso de Blueprints facilita el proceso de crecimiento y agregado de nuevas características a una aplicación.
  • Aislamiento de Rutas y Vistas: Los Blueprints aíslan las rutas y vistas permitiendo tener su propio prefijo URL. Esto evita problemas como las colisiones de rutas.
  • Configuración Personalizada: Es posible configurar y personalizar cada Blueprint de manera individual permitiendo configuraciones específicas para diferentes partes de la aplicación.

Creación de Blueprints

Para crear un Blueprint de una aplicación Flask se instancia la clase Blueprint pasándole los siguientes parámetros:

  • name Nombre del Blueprint que se utilizará para generar los nombres únicos de las vistas y templates.
  • import_name: Este valor opcional indica el nombre de importación del módulo actual. Generalmente este valor se especifica como __name__ .

Una vez inicializado el Blueprint se utiliza el nombre de la variable para definir las rutas en lugar de usar la variable de la aplicación app.

from flask import Blueprint
blueprintA = Blueprint('blueprintA', __name__)

@blueprintA.route('/blueprintA/')
def index():
    #Impementación

@blueprintA.route('/blueprintA/ver')
def ver():
    #Impementación

@blueprintA.route('/blueprintA/listar')
def listar():
    #Impementación

En el ejemplo anterior todas las rutas tienen en común el prefijo blueprintA en sus URLs. En lugar de esto es posible configurar el Blueprint para establecer por defecto dicho prefijo utilizando el parámetro url_prefix.

from flask import Blueprint
blueprintA = Blueprint('blueprintA', __name__,url_prefix='/blueprintA')

@blueprintA.route('/')
def index():
    #Impementación

@blueprintA.route('/ver')
def ver():
    #Impementación

@blueprintA.route('/listar')
def listar():
    #Impementación

De esta manera se simplifica la definición de rutas y se garantiza la unificación de todas las URLs para un mismo Blueprint.

Recursos

Cada Blueprint dentro de un proyecto puede tener asignados sus propios recursos tales como templates, imágenes, formularios, etc. Esto permite una gestión más sencilla de dichos recursos en aplicaciones complejas y que contienen funcionalidades muy variadas.

Para especificar la carpeta que contendrá los archivos estáticos de un Blueprint se utiliza el argumento static_folder y colocando el path absoluto o relativo a dicha carpeta.

from flask import Blueprint
blueprintA = Blueprint('blueprintA', __name__, static_folder='blueprintA/static')

Durante la construcción de URLs para obtener un archivo debe utilizarse el nombre del Blueprint separado por un punto de el nombre static. Automáticamente está carpeta será buscada de acuerdo al path configurado durante la instanciación del Blueprint.

url_for('blueprintA.static', filename='imagen.jpg')

De forma similar un Blueprint puede registrar una carpeta de templates utilizando el parámetro template_folder colocando el path absoluto o relativo a la carpeta donde se encontrarán las plantillas para dicho Blueprint.

blueprintA = Blueprint('blueprintA', __name__, template_folder='blueprintA/templates')

Registrar Blueprints

Para que los Blueprints definidos sean reconocidos por la aplicación Flask es necesario registrarlos dentro de la misma. Para registrar un Blueprint se utiliza el método register_blueprint de la aplicación Flask creada pasándole como parámetro el Blueprint instanciado.

from flask import Flask
from main.blueprintA import blueprintA

app = Flask(__name__)
app.register_blueprint(blueprintA)

Construcción de URLs

Durante el desarrollo de la aplicación será necesario construir rutas hacia las diferentes funcionalidades del sistema. Si se quiere crear una ruta hacia una funcionalidad de otro Blueprint es necesario especificar el nombre del mismo y luego, separado por un punto, el nombre de la función.

url_for('blueprintA.index')

En el caso de querer construir una URL hacia una función dentro del mismo Blueprint el nombre del mismo puede obviarse y comenzar la definición con un punto seguida por el nombre de la función.

url_for('.index')

En este artículo hemos visto cómo crear y registrar Blueprints en nuestra aplicación Flask para modularizar un proyecto. Hemos visto cómo asignar recursos a Blueprints como templates y archivos estáticos y cómo construir URLs hacia otros Blueprints. Espero que les sirva!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!


Andrea Navarro

- Ingeniera en Informática - Docente universitaria - Investigadora