Flask

Micro framework Python - noyau minimal, architecture flexible, ajoutez seulement ce dont vous avez besoin

TL;DR

En une ligne : Flask est le micro framework de Python - noyau minimal, ajoutez ce dont vous avez besoin.

Forces principales :

  • Minimal et flexible - pas de structure de projet imposée
  • Facile à apprendre - opérationnel en minutes
  • Extensible - énorme écosystème d’extensions
  • Werkzeug + Jinja2 - fondations éprouvées

Core Concepts

Concept 1: Routes = Decorators

Définir les routes avec des décorateurs :

from flask import Flask
app = Flask(__name__)

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

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

Concept 2: Request Context

Accéder aux données de requête via l’objet request :

from flask import request

@app.route('/search')
def search():
    query = request.args.get('q')        # Paramètres de requête
    page = request.args.get('page', 1)   # Avec défaut
    return f'Recherche: {query}'

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

Concept 3: Extensions

Flask est intentionnellement minimal. Ajoutez des fonctionnalités avec des extensions :

# Base de données
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)

# Authentification
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': 'Bonjour Flask!'})

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

Run

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

Gotchas

Debug mode is opt-in

# Développement - active l'auto-reload et le débogueur
flask run --debug

# Ou dans le code (pas pour la production !)
app.run(debug=True)

# Production - ne jamais utiliser debug=True
gunicorn app:app

Methods must be specified

# ❌ POST ne fonctionnera pas
@app.route('/users')
def users():
    return 'Utilisateurs'

# ✅ Autoriser explicitement POST
@app.route('/users', methods=['GET', 'POST'])
def users():
    if request.method == 'POST':
        return 'Créé', 201
    return 'Utilisateurs'

Application context required

# ❌ Erreur en dehors d'une requête
from flask import current_app
print(current_app.config)  # RuntimeError!

# ✅ Pousser le contexte manuellement
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

Idéal pour :

  • APIs petites à moyennes
  • Prototypes et MVPs
  • Équipes voulant un contrôle total
  • Microservices

Pas idéal pour :

  • Grandes apps nécessitant de la structure (utilisez Django)
  • Apps fortement async (utilisez FastAPI)
  • APIs de production nécessitant des auto-docs (utilisez FastAPI)

Comparaison :

FonctionnalitéFlaskDjangoFastAPI
TailleMicroCompletMicro
Courbe d’apprentissageFacileMoyenneFacile
Auto docsNonNonOui
AsyncLimitéLimitéNatif

Next Steps

Cheatsheet

PatternCode
Route@app.route('/path')
Méthodes@app.route('/', methods=['GET', 'POST'])
Paramètre URL@app.route('/<int:id>')
Paramètre queryrequest.args.get('q')
Corps JSONrequest.json
Réponse JSONjsonify({'key': 'value'})
Code de statutreturn data, 201
Redirectionredirect(url_for('index'))
Templaterender_template('index.html', name=name)
BlueprintBlueprint('name', __name__)