Estructura de proyectos Flask

Una aplicación Flask puede ser tan simple como tener un solo archivo.

Por ejemplo, el siguiente archivo hello.py es una aplicación Flask:

Ejemplo

from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello():
    return 'Hello, World!'

Sin embargo, cuando el proyecto crece, no es realista poner todo el código en un solo archivo.

La estructura de proyectos Flask puede variar según el tamaño y la complejidad de la aplicación.

A continuación se presentan varias estructuras comunes de proyectos Flask, adecuadas para aplicaciones simples y aplicaciones más complejas.

  1. Estructura de proyecto simple: Adecuada para aplicaciones pequeñas, todo el código se concentra en un solo archivo.
  2. Estructura de proyecto mediana: Divide la aplicación en varios módulos para facilitar la gestión y la expansión.
  3. Estructura de proyecto compleja: Admite una mayor modularidad, adecuada para aplicaciones grandes, incluye rutas, modelos, plantillas y directorios de archivos estáticos.

1. Estructura de proyecto simple

Para una aplicación Flask simple, la estructura del proyecto puede ser muy concisa:

my_flask_app/
│
├── app.py
└── requirements.txt
  • app.py: Archivo principal de la aplicación Flask, contiene la definición de rutas y funciones de vista.
  • requirements.txt: Lista las bibliotecas de dependencias del proyecto, se utiliza para registrar la información de versiones de Flask y otros paquetes.

Código del archivo app.py en el directorio my_flask_app:

Ejemplo

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)

Ejemplo de requirements.txt:

Flask==2.2.3

2. Estructura de proyecto mediana

Para aplicaciones un poco más complejas, normalmente se divide el proyecto en varios módulos y directorios:

my_flask_app/
│
├── app/
│   ├── __init__.py
│   ├── routes.py
│   └── models.py
│
├── config.py
├── requirements.txt
└── run.py
  • app/: Contiene el código principal de la aplicación Flask.
    • __init__.py: Inicializa la aplicación Flask y configura las extensiones.
    • routes.py: Define las rutas y las funciones de vista de la aplicación.
    • models.py: Define los modelos de datos de la aplicación.
  • config.py: Archivo de configuración, contiene la información de configuración de la aplicación.
  • requirements.txt: Lista las bibliotecas de dependencias del proyecto.
  • run.py: Se utiliza para iniciar la aplicación Flask.

Ejemplo de app/__init__.py:

Ejemplo

from flask import Flask

def create_app():
    app = Flask(__name__)
    app.config.from_object('config.Config')

    from . import routes
    app.register_blueprint(routes.bp)

    return app

Ejemplo de app/routes.py:

Ejemplo

from flask import Blueprint

bp = Blueprint('main', __name__)

@bp.route('/')
def home():
    return 'Hello, World!'

Ejemplo de run.py:

Ejemplo

from app import create_app

app = create_app()

if __name__ == '__main__':
    app.run(debug=True)

3. Estructura de proyecto compleja

Para aplicaciones más grandes, puede ser necesaria una estructura de proyecto más compleja para admitir una mayor modularidad y escalabilidad:

my_flask_app/
│
├── app/
│   ├── __init__.py
│   ├── routes/
│   │   ├── __init__.py
│   │   ├── main.py
│   │   └── auth.py
│   ├── models/
│   │   ├── __init__.py
│   │   └── user.py
│   ├── templates/
│   │   ├── layout.html
│   │   └── home.html
│   └── static/
│       ├── css/
│       └── js/
│
├── config.py
├── requirements.txt
├── migrations/
│   └── ...
└── run.py
  • app/routes/: Gestiona por separado las rutas de los diferentes módulos funcionales.
    • main.py: Rutas del módulo principal.
    • auth.py: Rutas relacionadas con la autenticación.
  • app/models/: Gestiona los modelos de datos, normalmente relacionado con operaciones de base de datos.
    • user.py: Modelo de usuario.
  • app/templates/: Almacena los archivos de plantillas HTML.
  • app/static/: Almacena archivos estáticos, como CSS y JavaScript.
  • migrations/: Archivos de migración de base de datos, normalmente relacionados con SQLAlchemy.

Ejemplo de app/routes/main.py:

Ejemplo

from flask import Blueprint, render_template

bp = Blueprint('main', __name__)

@bp.route('/')
def home():
    return render_template('home.html')

Ejemplo de app/models/user.py:

Ejemplo

from app import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(150), unique=True, nullable=False)
Otras extensiones