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:
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í:
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!