Flask — Cheat Sheet

Tag: flask, python, backend, api, rest, wsgi, jinja2

Livello: intermedio

TL;DR: Microframework WSGI sincrono per Python, minimale ed estensibile, basato su Werkzeug e Jinja2. Ideale per microservizi, API REST e prototipazione rapida senza boilerplate imposto.

Concetti chiave

-

Microframework: non include ORM, autenticazione o validazione di default, lasciando totale liberta di architettura.

-

Basato su Werkzeug per il routing e la gestione WSGI, e Jinja2 per il templating server-side.

-

Application Context e Request Context isolano lo stato globale tramite LocalProxy per singola richiesta.

-

I Blueprint consentono di modularizzare rotte, viste e middleware per scalare l'applicazione.

-

Application Factory pattern (create_app) permette test isolati, configurazioni multiple e instanziazione pulita.

-

Il ciclo di vita include hook dedicati: before_request, after_request e teardown_appcontext.

-

Estendibile tramite l'ecosistema Flask (Flask-SQLAlchemy, Flask-Migrate, Flask-JWT-Extended, Flask-Marshmallow).

-

In produzione richiede un WSGI HTTP Server dedicato (Gunicorn, uWSGI) dietro a un reverse proxy (Nginx).

Domande tipiche e risposte pronte

-

Q: Qual e la differenza chiave tra Flask e Django?R: Django e un framework batteries-included con ORM e admin integrati; Flask e un microframework che fornisce solo routing e WSGI base, dandoci piena liberta architetturale.

-

Q: A cosa servono l'Application Context e il Request Context?R: Isolano i dati della richiesta (request, session) e dell'app (current_app, g) sui thread di esecuzione, evitando conflitti di concorrenza senza passare parametri ovunque.

-

Q: Come organizzi un progetto Flask per mantenerlo scalabile e manutenibile?R: Uso l'Application Factory pattern combinato con i Blueprint per modularizzare le rotte per dominio, gestendo configurazioni tramite classi o variabili d'ambiente.

-

Q: Perche non si usa il development server di Flask (flask run) in produzione?R: E un server single-threaded non ottimizzato per gestire carichi concorrenti, sicurezza o drop di connessioni; in produzione serve un server WSGI come Gunicorn.

-

Q: Come si gestisce l'autenticazione stateless (JWT) in un'API Flask?R: Integro Flask-JWT-Extended oppure valido i token Bearer negli header di richiesta tramite un decoratore personalizzato che popola l'oggetto g.user.

Insidie e errori comuni

-

Uso di variabili globali per memorizzare dati della richiesta, che causa race condition tra thread; usare g.

-

Modificare l'oggetto response in after_request senza ritornarlo, rompendo la pipeline HTTP.

-

Creare istanze globali dell'app invece di usare l'Application Factory, rendendo complessi i test e i mock.

-

Dipendere da dipendenze circolari importando l'istanza app direttamente all'interno dei file delle rotte.

-

Esporre il flag debug=True in ambienti di staging o produzione, consentendo l'esecuzione di codice arbitrario da console.

-

Confondere teardown_request con after_request: teardown viene eseguito sempre, anche in caso di eccezioni non gestite.

Snippet e comandi

# Avvio in ambiente di sviluppo
export FLASK_APP=wsgi.py
export FLASK_ENV=development
flask run --port=5000

# Esecuzione in produzione con Gunicorn (4 worker)
gunicorn -w 4 -b 0.0.0.0:8000 "app:create_app()"

Python

# Application Factory con Blueprint e Context
from flask import Flask, jsonify, request, g, Blueprint

api_bp = Blueprint("api_v1", __name__, url_prefix="/api/v1")

@api_bp.before_request
def authenticate():
    auth_header = request.headers.get("Authorization")
    if not auth_header:
        return jsonify({"error": "Unauthorized"}), 401
    g.user_id = "user_123"

@api_bp.route("/items", methods=["GET"])
def list_items():
    return jsonify({"user": g.user_id, "data": []}), 200

def create_app():
    app = Flask(__name__)
    app.config.from_mapping(SECRET_KEY="secure-key")
    app.register_blueprint(api_bp)
    return app

Da ripassare

-

[ ] Meccanismo interno di werkzeug.local.LocalProxy e differenze tra current_app e app.

-

[ ] Configurazione ottimale del numero di worker e thread in Gunicorn per carichi I/O-bound.

-

[ ] Gestione globale delle eccezioni con il decoratore @app.errorhandler.

-

[ ] Integrazione di sessioni server-side con Flask-Session e Redis.

-

[x] Routing di base, parametri di rotta e converter (int, string, uuid).

-

[x] Serializzazione risposte con jsonify e lettura payload con request.get_json().

Riferimenti

-

Documentazione ufficiale Flask: [https://flask.palletsprojects.com/](https://flask.palletsprojects.com/)

-

Documentazione Werkzeug: [https://werkzeug.palletsprojects.com/](https://werkzeug.palletsprojects.com/)

-

Documentazione Gunicorn: [https://docs.gunicorn.org/](https://docs.gunicorn.org/)

Jarvis Interviews
Jarvis