Flask para aplicaciones grandes: blueprints

Flask

Quizás, sea uno de los aspectos más complejos de Flask, y es el uso de Blueprints, tan necesarios para hacer aplicaciones más complejas, o que necesiten una mejor organización del código.

El primer detalle importante es que la organización cambia un poco. Veamos la distribución de directorios y ficheros del proyecto del que partimos:

Organización inicial de proyecto Flask

Organización inicial de proyecto Flask

Cómo veis, cumplimos con lo que Flask necesita, al disponer de un directorio templates y otro static.

Antes de seguir, os hago dos recomencaciones para profundizar en Flask, y es ver los videos y el tutorial de realpython, y por supuesto, a Miguel Grinberg (os recomiendo que veais … si teneis tiempo, su ponencia de 3 horas en PyCon 2014 que podeis encontrar en Youtube)

Fichero de configuración

La realidad es que cualquier proyecto Flask debería incluir un fichero de configuración del proyecto: config.py, que es donde se guarda todo lo que se necesita para configurar la aplicación Flask, como la clave secreta, dónde está la base de datos, modo depuración o no, etc, etc, …


import os

class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY')

class Development(Config):
    DEBUG = True
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'clave'
class Testing(Config):
    TESTING = True

class Production(Config):
    pass    

config = {
    'development': Development,
    'testing': Testing,
    'production': Production,

    'default': Development
}

El uso de este config.py es muy interesante para cuando subamos el código al servidor de producción, y con una simple modificación, todo cambia (para mejorar la seguridad, por supuesto).

Run.py

Para lanzar la aplicación, creamos el fichero run.py, cuyo contenido es bastante simple: definimos qué tipo de configuración queremos que tenga la app, y … listo!

from app import create_app

app = create_app('default')
app.run()

El directorio app

Lo siguiente es crear el directorio de la aplicación app, y aquí sí que creamos los directorios static y templates. Básicamente, en templates se guardarán las plantillas generales, que sean utilizadas por toda la aplicación, como base.html, o index.html. En static pondremos los ficheros css y javascript.

Para que el contenido del directorio sea accesible en Python, debemos crear __init__.py, donde definiremos la función que utilizamos en run.py para crear el objeto app con su correspondiente configuración:


from flask import Flask
from config import config

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])

    # Configuracion de los BluePrints
    from .miblueprint import miblue as miblueprint
    app.register_blueprint(miblueprint)

    return app

Aquí será donde quedan registrados los Blueprints.

Que son Blueprints

Blueprints son módulos con los que se construyen las aplicaciones Flask. Los objetos Blueprints son similares a Flask, pero con la diferencia de que una aplicación sólo tendrá un objeto Flask, mientras que puede tener varios Blueprints. La ventaja de su uso es que para aplicaciones largas puedo distribuir el código en varios ficheros, en lugar de tenerlos todo en un único fichero.

Así que creo un directorio miblueprint, y dentro de éste, creo mi directorio de templates (el static no hace falta). Al igual que antes, vamos a empezar por __init__.py:, que es donde definimos el objeto Blueprint, su nombre, y definimos que el directorio templates es el que queremos utilizar para nuestras plantillas:


from flask import Blueprint
miblue = Blueprint('miblue', __name__, template_folder='templates')
from . import routes

La última línea es importante, pues requerimos de routes.py, archivo que es donde se definen las distintas rutas con las que trabajará el Blueprint.


from flask import Flask, render_template, url_for
from . import miblue

@miblue.route('/')
def index():
return render_template('index2.html')

@miblue.route('/saludo')
def saludo():
return render_template('saludo.html')

@miblue.route('/user/<username>')
def user(username):
return render_template('user.html', username=username)

Y con esto, ya tenemos las rutas migradas, pero al Blueprint. La nueva estructura queda así:

flask con blueprints

flask con blueprints

Una plantilla base

El caso es que gran parte del código hasta ahora presentado puede ser ampliamente utilizado como base para futuros proyectos, por lo que en GitHub teneis una plantilla (de momento, es la versión inicial), a la que espero contribuciones.

Y de momento, eso es todo … que no es poco!