Flask

Micro framework Python - nucleo minimo, arquitectura flexible, anade solo lo que necesites

TL;DR

En una línea: Flask es el micro framework de Python - núcleo mínimo, añade lo que necesites.

Fortalezas principales:

  • Mínimo y flexible - sin estructura de proyecto forzada
  • Fácil de aprender - funcionando en minutos
  • Extensible - enorme ecosistema de extensiones
  • Werkzeug + Jinja2 - fundaciones probadas en batalla

Core Concepts

Concept 1: Routes = Decorators

Define rutas con decoradores:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return '¡Hola!'

@app.route('/users/<int:user_id>')
def get_user(user_id):
    return f'Usuario {user_id}'

Concept 2: Request Context

Accede a datos de request a través del objeto request:

from flask import request

@app.route('/search')
def search():
    query = request.args.get('q')        # Parámetros de query
    page = request.args.get('page', 1)   # Con valor por defecto
    return f'Buscando: {query}'

@app.route('/users', methods=['POST'])
def create_user():
    data = request.json                   # Cuerpo JSON
    return {'created': data}

Concept 3: Extensions

Flask es intencionalmente mínimo. Añade características con extensiones:

# Base de datos
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)

# Autenticación
from flask_login import LoginManager
login = LoginManager(app)

# APIs REST
from flask_restful import Api
api = Api(app)

Quick Start

Install

pip install flask

Create app.py

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/')
def hello():
    return jsonify({'message': '¡Hola Flask!'})

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

Run

flask run --debug
# Abre http://localhost:5000

Gotchas

Debug mode is opt-in

# Desarrollo - habilita auto-reload y debugger
flask run --debug

# O en código (¡no para producción!)
app.run(debug=True)

# Producción - nunca usar debug=True
gunicorn app:app

Methods must be specified

# ❌ POST no funcionará
@app.route('/users')
def users():
    return 'Usuarios'

# ✅ Permitir POST explícitamente
@app.route('/users', methods=['GET', 'POST'])
def users():
    if request.method == 'POST':
        return 'Creado', 201
    return 'Usuarios'

Application context required

# ❌ Error fuera de un request
from flask import current_app
print(current_app.config)  # RuntimeError!

# ✅ Empujar contexto manualmente
with app.app_context():
    print(current_app.config)

Blueprints for larger apps

# users.py
from flask import Blueprint, jsonify

users_bp = Blueprint('users', __name__)

@users_bp.route('/')
def list_users():
    return jsonify([])

# app.py
from users import users_bp
app.register_blueprint(users_bp, url_prefix='/users')

When to Use

Ideal para:

  • APIs pequeñas a medianas
  • Prototipos y MVPs
  • Equipos que quieren control total
  • Microservicios

No ideal para:

  • Apps grandes que necesitan estructura (usa Django)
  • Apps con mucho async (usa FastAPI)
  • APIs de producción que necesitan auto-docs (usa FastAPI)

Comparación:

CaracterísticaFlaskDjangoFastAPI
TamañoMicroCompletoMicro
Curva de aprendizajeFácilMediaFácil
Auto docsNoNo
AsyncLimitadoLimitadoNativo

Next Steps

Cheatsheet

PatrónCódigo
Ruta@app.route('/path')
Métodos@app.route('/', methods=['GET', 'POST'])
Parámetro URL@app.route('/<int:id>')
Parámetro queryrequest.args.get('q')
Cuerpo JSONrequest.json
Respuesta JSONjsonify({'key': 'value'})
Código de estadoreturn data, 201
Redirecciónredirect(url_for('index'))
Templaterender_template('index.html', name=name)
BlueprintBlueprint('name', __name__)