Guide moderne du développement Back-end : Micro-frameworks, APIs robustes, Sécurité et Déploiement Cloud.
Si JavaScript règne sur le Frontend, Python est le roi du Backend moderne, notamment grâce à l'essor de l'IA. Des géants comme Instagram, Spotify, Netflix et Uber utilisent Python pour gérer des millions de requêtes.
Avec l'arrivée de l'asynchrone (FastAPI) et la maturité de Django, Python offre l'équilibre parfait entre rapidité de développement et performance à l'échelle.
Mise en situation et architectures
Python n'est pas exécuté nativement par les navigateurs (contrairement à JavaScript). Son rôle se situe côté Serveur (Back-end).
Il reçoit les requêtes HTTP, traite la logique métier, interagit avec la base de données, et renvoie une réponse (HTML ou JSON).
Pour communiquer avec les serveurs web (comme Nginx ou Apache), Python utilise des standards : WSGI (synchrone, classique) ou ASGI (asynchrone, moderne).
Recevoir une requête, exécuter une logique métier, répondre en HTML ou JSON.
URL, paramètres, formulaires, cookies, headers, payload JSON.
Page HTML, JSON d'API, redirection, fichier téléchargé.
Sessions, tokens JWT, cache, base de données.
Latence, sécurité, montée en charge, observabilité.
API fiable, performante, maintenable et documentée.
Navigateur │ HTTP (GET/POST) ▼ Serveur Web (Nginx/Apache) │ reverse proxy ▼ Serveur d'application (Gunicorn/Uvicorn) │ WSGI ou ASGI ▼ Python (routes, logique, ORM) │ ▼ Base de données / Cache / Services externes │ ▼ Réponse (HTML/JSON)
Python compose la page HTML et renvoie une vue prête à afficher. Idéal pour les sites orientés contenu et SEO.
Python expose des endpoints, et un front (React/Vue/Svelte) consomme l'API. Idéal pour les apps riches et interactives.
WSGI est le standard historique pour des apps synchrones. Simple, robuste, très répandu en production (Gunicorn + Flask/Django).
ASGI étend WSGI pour l'asynchrone, les WebSockets et les tâches en streaming. Indispensable pour le temps réel (Uvicorn + FastAPI/Django async).
Une app moderne est découpée en couches pour rester lisible et testable :
Routes → Services → Accès données → Infrastructure.
Ce découpage simplifie la maintenance, évite le code spaghetti et facilite la montée en charge.
Combien d'utilisateurs ? Quels temps de réponse ? Temps réel ? API publique ? Équipe ?
Monolithe simple au début, micro-services quand les besoins et l'équipe grandissent.
Minimaliste, flexible. Vous choisissez vos outils. Idéal pour débuter ou pour des micro-services.
Tout inclus (ORM, Admin, Auth). Robuste et sécurisé. Idéal pour des projets complexes rapides.
Moderne, asynchrone, typé. Génère automatiquement la doc API. Le nouveau standard.
Mesurez votre niveau sur l'ensemble de l'écosystème Python Web (Flask, Django, FastAPI, Docker, etc.).
🚀 Lancer le Quiz GlobalIsolation, dépendances, workflow d’équipe
En développement web, il est CRITIQUE d'isoler les dépendances de chaque projet pour éviter les conflits de versions.
On utilise un Virtual Environment (venv). C'est un dossier local qui contient une copie de l'interpréteur Python et des bibliothèques installées.
On évite ainsi qu'une mise à jour globale casse un autre projet.
Environnement isolé local au projet.
Liste figée des dépendances installées.
Configuration moderne (build, deps, outils).
Variables sensibles et configs locales.
Accélère les installs en CI/CD.
La base du projet, à figer clairement.
# 1. Créer le dossier projet mkdir mon_projet ; cd mon_projet # 2. Créer l'environnement virtuel python -m venv venv # 3. Activer l'environnement # Windows : venv\Scripts\activate # Mac/Linux : source venv/bin/activate # 4. Installer les dépendances pip install flask sqlalchemy python-dotenv # 5. Figer les versions pip freeze > requirements.txt
Cloner le repo → créer venv → installer deps → lancer l’app → exécuter les tests.
Oublier d’activer le venv et installer les packages globalement.
Dév local │ pip install ▼ requirements.txt (ou pyproject.toml) │ ▼ CI/CD installe les mêmes versions │ ▼ Production stable
Lockfile : fige exactement les versions pour un build reproductible.
Build backend : manière de compiler/packager une lib (PEP 517).
12-factor config : séparer la config du code via variables d’env.
Plus ancien que venv, encore très utilisé.
Environnements + lockfile, orienté simplicité.
Gestion moderne des deps via pyproject.toml.
Gestionnaire ultra rapide, workflow moderne.
Très utilisé en data science, plus lourd.
Compile un requirements.txt verrouillé.
— Version Python précisée.
— Dépendances figées (requirements ou lockfile).
— .env.example fourni.
— Commandes de lancement documentées.
— Tests basiques exécutables.
Objectif : créer un squelette web propre en 10 minutes.
Étape 1 — Créez un venv et installez Flask.
Étape 2 — Lancez une route “/health” qui renvoie “OK”.
Étape 3 — Figez vos dépendances et partagez le projet.
Micro-framework WSGI flexible et extensible
Flask est dit "Micro" non pas parce qu'il manque de puissance, mais parce qu'il ne prend pas de décisions à votre place (pas d'ORM imposé, pas de système de login par défaut). Il repose sur deux piliers : Werkzeug (WSGI) et Jinja2 (Templating).
Dans une application Flask, le flux suit une route précise de la requête à la réponse :
Flask utilise des Proxies pour accéder à des données globales sans polluer les signatures de fonctions :
request : Accès aux données de la
requête (args, form, json).session : Stockage sécurisé côté
client (cookies signés).g : Objet temporaire pour une
seule
requête (ex: stocker la connexion DB).current_app : Accès à l'instance
de
l'application active.Pour un projet sérieux, on évite le fichier unique. On utilise le Application Factory Pattern.
/mon_projet ├── /app # Package principal │ ├── __init__.py # Initialisation (Factory) │ ├── models.py # Définition des DB │ ├── /auth # Module d'authentification │ │ ├── routes.py │ │ └── forms.py │ └── /api # Module API REST │ └── routes.py ├── config.py # Configurations (Dev, Prod, Test) └── requirements.txt
from flask import Flask from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() def create_app(): app = Flask(__name__) app.config.from_object('config.Config') db.init_app(app) # Enregistrement des Blueprints from .auth import auth_bp app.register_blueprint(auth_bp, url_prefix='/auth') return app
Définissez un base.html et "étendez-le" dans vos pages avec
{% extends "base.html" %}.
Transformez vos données dans l'HTML : {{ date | format_date }} ou
{{ texte | truncate(50) }}.
Créez des composants réutilisables (fonctions HTML) pour vos formulaires ou boutons.
| Extension | Rôle |
|---|---|
Flask-SQLAlchemy |
Intégration simplifiée de l'ORM SQLAlchemy. |
Flask-Migrate |
Gestion des migrations de base de données (Alembic). |
Flask-Login |
Gestion des sessions et authentification utilisateur. |
Flask-WTF |
Formulaires sécurisés avec protection CSRF. |
Flask-JWT-Extended |
Authentification par jeton (JSON Web Tokens). |
Le standard industriel pour la persistance en Python
SQLAlchemy n'est pas qu'un simple ORM (Object-Relational Mapper) ; c'est une boîte à outils complète qui sépare l'Abstraction SQL de la Gestion des Objets. Il permet de manipuler vos bases de données comme des objets Python tout en conservant la puissance du SQL brut si nécessaire.
La Session agit comme une Unité de Travail (Unit of Work). Elle
suit
tous les changements apportés à vos objets avant de les synchroniser avec la base.
Un modèle bien défini utilise des types précis et des contraintes pour garantir l'intégrité des données.
from flask_sqlalchemy import SQLAlchemy from datetime import datetime db = SQLAlchemy() class Post(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100), nullable=False) content = db.Column(db.Text, nullable=False) date = db.Column(db.DateTime, default=datetime.utcnow) # Relation Many-to-One user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
Un utilisateur a plusieurs articles. Utilisation de db.relationship() pour naviguer
facilement entre les objets.
joinedload() permet de récupérer les données liées en une seule requête SQL (évite
le
problème N+1).
Par défaut, SQLAlchemy ne charge les relations que lorsqu'on y accède, économisant de la mémoire sur les objets simples.
# CREATE user = User(username='alice') db.session.add(user) db.session.commit() # READ users = User.query.all() bob = User.query.filter_by(username='bob').first() # UPDATE bob.email = 'bob@new.com' db.session.commit() # DELETE db.session.delete(user) db.session.commit()
En production, on n'utilise jamais db.create_all(). On utilise Alembic
(via
Flask-Migrate) pour versionner les changements de schéma de la base de données.
Une nouvelle lib basée sur SQLAlchemy et Pydantic, idéale pour FastAPI car elle fusionne modèles DB et schémas de validation.
Un ORM beaucoup plus léger et simple, parfait pour de petits projets ou scripts où SQLAlchemy serait surdimensionné.
"Batteries included" - Productivité maximale et sécurité native
Django est un framework web de haut niveau qui encourage un développement rapide et une conception propre. Contrairement à Flask, il arrive avec tout le nécessaire : ORM, Auth, Admin, Migrations, et protection contre les failles (SQLi, XSS, CSRF) activées par défaut.
Django utilise une variante du MVC appelée Model-View-Template. La logique de contrôle est gérée par le framework lui-même.
C'est l'un des "tueurs" de Django : une interface de gestion de contenu générée automatiquement à partir de vos modèles.
from django.contrib import admin from .models import Product @admin.register(Product) class ProductAdmin(admin.ModelAdmin): list_display = ('name', 'price', 'stock') search_fields = ('name',) list_filter = ('category',)
Pour les tâches courantes (lister, afficher, créer), Django propose des classes génériques qui réduisent drastiquement le code.
from django.views.generic import ListView from .models import Post class PostListView(ListView): model = Post template_name = 'blog/list.html' paginate_by = 10 # Pagination automatique !
Si vous voulez créer des APIs, DRF est le standard absolu pour Django. Il ajoute des sérialiseurs puissants et une interface de test d'API.
from rest_framework import serializers from .models import User class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['id', 'username', 'email']
Des composants qui interceptent chaque requête/réponse pour gérer l'auth, la compression, ou le cache globalement.
Permettent à des applications découplées d'être notifiées quand des actions se produisent (ex: créer un profil après l'inscription).
Framework ASGI ultra-rapide basé sur les types Python 3.10+
FastAPI est le framework qui a révolutionné le backend Python récent. Il repose sur deux piliers :
Starlette (pour la partie web asynchrone) et Pydantic (pour la
validation de données ultra-rapide). Sa signature ? L'utilisation massive des
Type Hints de
Python pour générer automatiquement de la documentation et valider les requêtes.
Contrairement à Flask (WSGI), FastAPI est ASGI (Asynchronous Server Gateway Interface). Il peut gérer des milliers de connexions simultanément sans bloquer le serveur.
Fini les erreurs de type KeyError. FastAPI convertit le JSON entrant en vrais objets
Python typés.
from pydantic import BaseModel, Field class Item(BaseModel): name: str price: float = Field(gt=0, description="Doit être positif") is_offer: bool | None = None @app.post("/items/") async def create_item(item: Item): return item # Auto-sérialisation JSON
FastAPI possède un système puissant pour gérer les pré-requis (Auth, DB, Logging) de manière modulaire.
from fastapi import Depends, Header async def get_token(x_token: str = Header()): if x_token != "fake-secret": raise HTTPException(status_code=400) return x_token @app.get("/secure-data/") async def read_data(token: str = Depends(get_token)): return {"auth": True}
Sans aucun code supplémentaire, FastAPI génère deux documentations interactives complètes :
Permet de tester vos APIs directement depuis le navigateur avec un bouton "Try it out".
Une version plus structurée et design, idéale pour la documentation technique partagée avec d'autres équipes.
| Fonctionnalité | Description |
|---|---|
Background Tasks |
Lancer des fonctions après avoir renvoyé une réponse (ex: envoi d'email). |
FastAPI Lifespan |
Gérer les événements de démarrage et d'extinction (connexions DB). |
Middleware |
Gérer les CORS, Gzip, ou ajouter des headers personnalisés. |
Path & Query Params |
Validation stricte des paramètres d'URL via Query et Path.
|
Concevoir des interfaces robustes, prévisibles et scalables
Le style architectural REST (Representational State Transfer) n'est pas un protocole, mais un ensemble de contraintes. Une API "RESTful" utilise les standards du web (HTTP, URL, JSON) pour manipuler des ressources de manière sans état (stateless).
| Méthode | Action | Idempotent ? | Usage |
|---|---|---|---|
GET |
🔍 Récupérer | ✅ Oui | Récupérer une liste ou un élément (Lecture seule). |
POST |
➕ Créer | ❌ Non | Créer une nouvelle ressource (N+1 exécutions = N+1 créations). |
PUT |
🔄 Remplacer | ✅ Oui | Remplacer entièrement une ressource existante. |
PATCH |
📝 Modifier | ❌ Non | Modification partielle d'une ressource (souvent asynchrone). |
DELETE |
🗑️ Supprimer | ✅ Oui | Supprimer une ressource (2 exécutions = même résultat final). |
REST renvoie souvent trop de données. GraphQL permet au client de choisir exactement ses champs.
REST nécessite souvent plusieurs appels d'API. HATEOAS (liens hypermédias) aide à la navigation.
Pour des microservices ultra-rapides, gRPC (Protocol Buffers) est souvent plus efficace que le JSON/REST.
Niveau 0 : HTTP pur. Niveau 1 : Ressources (URI). Niveau 2 : Verbes HTTP. Niveau 3 : HATEOAS (Le Graal du REST).
{
"data": {
"type": "articles",
"id": "1",
"attributes": { "title": "REST is Life" },
"links": { "self": "/articles/1" }
}
}
id.Hashing, JWT, CORS et Architecture Défensive
La sécurité n'est pas une "feature" qu'on ajoute à la fin, c'est une fondation. En Python Web, cela signifie gérer correctement l'identité (Authentification) et les droits (Autorisation), tout en se protégeant contre les menaces automatisées.
On ne stocke JAMAIS de mot de passe. On stocke un Hash unique. Plus
l'algorithme est "lent" (coûteux en CPU/Mémoire), plus il résiste aux attaques par force brute.
from passlib.context import CryptContext pwd_context = CryptContext(schemes=["argon2", "bcrypt"]) # Inscription hash = pwd_context.hash("mypassword") # Vérification is_ok = pwd_context.verify("mypassword", hash)
Le JSON Web Token permet d'identifier un utilisateur sans interroger la DB à chaque requête. Le secret côté serveur garantit l'intégrité.
Configurez les Cross-Origin Resource Sharing pour n'autoriser que vos domaines
front-end
de confiance.
Utilisez toujours les ORM (SQLAlchemy, Django) pour échapper automatiquement les paramètres et éviter les injections SQL.
Limitez le nombre de requêtes par IP (ex: via Flask-Limiter) pour contrer le DoS ou le brute-force.
from jose import jwt, JWTError def validate_access(token: str): try: payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"]) user_id = payload.get("sub") if user_id is None: raise HTTPException(status_code=401) return user_id except JWTError: raise HTTPException(status_code=401, detail="Invalid Token")
payload d'un JWT. Le JWT est lisible par n'importe qui (Base64), il n'est que
signé, pas chiffré.
Permission basée sur le titre (ex: admin, éditeur, utilisateur). Simple et efficace pour la plupart des apps.
Permission complexe basée sur des attributs (ex: "Peut éditer si l'article lui appartient ET s'il est avant 18h").
Du parallélisme avec AsyncIO à la communication Full-Duplex
Le web moderne ne se limite plus au cycle "Requête / Réponse". Avec l'asynchronisme
(asyncio) et les WebSockets, Python peut gérer des flux de données en
temps réel (chats, dashboards live, jeux) sans bloquer ses ressources systèmes.
Au lieu de créer un thread par utilisateur (coûteux), Python utilise une Boucle d'Événements. Quand une tâche attend (ex: lecture DB), le serveur passe instantanément à la suivante.
Alors que l'HTTP ferme la connexion après chaque réponse, le WebSocket maintient un tunnel ouvert et bidirectionnel.
from fastapi import FastAPI, WebSocket app = FastAPI() @app.websocket("/ws/{client_id}") async def websocket_endpoint(websocket: WebSocket, client_id: int): await websocket.accept() try: while True: data = await websocket.receive_text() # Push de données au client sans qu'il demande await websocket.send_text(f"Message reçu : {data}") except Exception: print("Client déconnecté")
Envoyer un message à tous les utilisateurs connectés simultanément (ex: notification système).
Idéal pour le trading ou les collaborations en direct (type Google Docs) où chaque ms compte.
Socket.io (couche au-dessus de WS pour la reconnexion auto) ou Server-Sent Events (SSE) pour du push unidirectionnel.
Les WebSockets nécessitent un serveur compatible ASGI (comme Uvicorn ou
Daphne) et une configuration spécifique de Nginx
(proxy_set_header Upgrade $http_upgrade;) pour ne pas couper la connexion.
import httpx import asyncio async def fetch_data(): async with httpx.AsyncClient() as client: resp = await client.get("https://api.example.com") return resp.json() # Lancer plusieurs requêtes en parallèle results = await asyncio.gather(fetch_data(), fetch_data())
Optimiser l'expérience utilisateur en déchargeant les opérations lourdes
Dans une application web, la règle d'or est la réactivité. Si une action prend plus de 200ms (envoi d'email, génération de PDF, calcul IA), elle ne doit pas bloquer la requête HTTP. La solution : le pattern Producteur-Consommateur.
L'application (Producteur) envoie un message dans une file d'attente (Broker). Un processus séparé (Worker) récupère ce message et l'exécute en arrière-plan.
FastAPI BackgroundTasks : Exécution dans le même processus après la réponse. Simple, idéal pour les emails rapides.
Celery / Dramatiq : Processus isolés, gestion des retries, monitoring, scheduling (Crontab).
from fastapi import BackgroundTasks @app.post("/report") async def generate_report(bg: BackgroundTasks): # S'exécute APRES le return bg.add_task(big_calculation) return {"status": "En cours"}
from celery import Celery app = Celery(broker="redis://...") @app.task def heavy_task(x): return x ** 2 # Appel immédiat, réponse non bloquée heavy_task.delay(10)
Plus vous avez de tâches de fond, plus vous avez besoin de visibilité sur leur état (échec, succès, temps d'exécution).
L'interface web standard pour monitorer Celery en temps réel (files, workers, taux d'erreur).
Celery permet de re-tenter automatiquement une tâche si une API tierce est temporairement indisponible.
Le planificateur de Celery pour exécuter des tâches à intervalle régulier (ex: stats tous les lundis à 8h).
Redis est parfait pour débuter (simple, rapide, souvent déjà là pour le cache). RabbitMQ est plus robuste pour des millions de messages avec des routages complexes.
Une alternative à Celery qui se veut plus simple, avec moins de configuration et des erreurs plus claires.
Des bibliothèques basées sur Redis et asyncio, parfaites si votre projet est
déjà
100% asynchrone.
De l'unitaire à l'intégration : coder avec confiance
Un code sans tests est un code "legacy" dès sa naissance. En Python Web, tester permet de s'assurer que vos routes renvoient les bons statuts, que vos modèles calculent correctement et que vos migrations n'ont rien cassé. Pytest est l'outil standard pour cette mission.
Pour une stratégie efficace, privilégiez une large base de tests unitaires (rapides) et moins de tests de bout-en-bout (lents/fragiles).
Fini la lourdeur de unittest. Pytest utilise de simples assert et un
système de Fixtures révolutionnaire.
import pytest from main import app from fastapi.testclient import TestClient @pytest.fixture def client(): # Setup : crée l'objet avant le test with TestClient(app) as c: yield c # Teardown : nettoyage auto après
Si votre fonction appelle une API externe ou une DB lente, simulez son comportement pour que vos tests restent rapides et déterministes.
from unittest.mock import MagicMock def test_payment_process(mocker): # On remplace l'appel réel à Stripe mock_stripe = mocker.patch("services.stripe.charge") mock_stripe.return_value = {"status": "success"} res = process_order(100) assert res is True mock_stripe.assert_called_once()
Le Code Coverage indique le pourcentage de lignes de code exécutées par vos tests. Visez 80%+, mais rappelez-vous : 100% de couverture ≠ 0 bugs.
pytest --cov-report html génère un site web pour visualiser les lignes non testées.
Bloquez le déploiement si la couverture descend en dessous d'un certain seuil (Security Gate).
Test-Driven Development : Écrire le test (rouge), coder (vert), refactoriser.
N'utilisez jamais votre DB de prod ou de dev pour les tests. Configurez une base SQLite en mémoire ou un container Docker dédié qui est réinitialisé par les fixtures.
Analyse statique pour détecter les erreurs de syntaxe, les imports inutilisés ou le code mort.
Formatage automatique du code pour que tout le projet respecte strictement la PEP 8 sans débat.
Passer du serveur de développement à une architecture robuste
Le serveur fourni par flask run ou manage.py runserver n'est
JAMAIS destiné à la production. Il est lent, peu sécurisé et monothread. En
production,
on utilise un Serveur d'Application et un Reverse Proxy.
En production, on ne branche jamais l'application directement sur Internet. On utilise Nginx comme "bouclier" et Gunicorn/Uvicorn comme moteur de calcul.
# -w : Nombre de workers (2 * CPU + 1) # -b : Bind sur une adresse gunicorn -w 4 -b 0.0.0.0:8000 app:app
uvicorn main:app \ --host 0.0.0.0 \ --port 8000 \ --workers 4
| Type de Worker | Framework | Usage Idéal |
|---|---|---|
Sync (Default) |
Django / Flask | Requêtes rapides, calculs CPU standards. |
Gevent / Eventlet |
Flask | Requêtes avec beaucoup d'attente I/O sans async. |
UvicornWorker |
FastAPI | Tout ce qui utilise async/await. |
Pour les déploiements Cloud (Heroku, Docker) où Nginx n'est pas toujours disponible, WhiteNoise permet à votre application Python de servir elle-même ses fichiers statiques avec une efficacité proche de Nginx.
server {
listen 80;
server_name myapp.com;
location /static/ {
alias /path/to/static/;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Isolation, reproductibilité et déploiement simplifié
Docker permet d'emballer votre application Python, ses dépendances et sa configuration dans une Image immuable. "Ça marche sur ma machine" devient "Ça marche partout où il y a Docker".
L'ordre des instructions est crucial pour profiter du cache des couches. Copiez toujours les fichiers de dépendances avant le code.
# 1. Image de base légère FROM python:3.11-slim # 2. Variables d'environnement Python ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 WORKDIR /app # 3. Cache des dépendances COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 4. Copie du code COPY . . CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app:app"]
Utilisez une image lourde pour compiler (ex: avec gcc) et une image ultra-légère pour l'exécution finale. Votre image passe de 800Mo à 150Mo.
# STAGE 1: Builder FROM python:3.11-slim as builder RUN apt-get update && apt-get install -y gcc libpq-dev COPY requirements.txt . RUN pip install --user --no-cache-dir -r requirements.txt # STAGE 2: Final FROM python:3.11-slim WORKDIR /app COPY --from=builder /root/.local /root/.local ENV PATH=/root/.local/bin:$PATH COPY . . CMD ["python", "main.py"]
Ne lancez pas vos conteneurs à la main. Définissez toute votre stack (App, DB, Redis) dans un seul fichier YAML.
services: web: build: . ports: ["8000:8000"] depends_on: [db] environment: [DATABASE_URL=postgres://user:pass@db:5432/db] db: image: postgres:15-alpine volumes: ["postgres_data:/var/lib/postgresql/data"] volumes: postgres_data:
Utilisez les Volumes pour la persistance des données (DB) en prod. Utilisez les Bind Mounts pour le développement (partage de dossier code entre l'hôte et le conteneur).
| Commande | Action |
|---|---|
docker build -t app:v1 . |
Créer une image à partir du Dockerfile. |
docker ps -a |
Lister tous les conteneurs (actifs ou non). |
docker exec -it ID sh |
Entrer dans un conteneur en cours d'exécution. |
docker compose up -d |
Lancer toute la stack en arrière-plan. |
docker system prune |
⚠️ Nettoyer tout ce qui est inutile (images orphelines, etc). |
L'arsenal indispensable pour tout développeur Python Web
Maîtriser Python Web ne s'arrête pas au code. C'est aussi savoir choisir les bons outils de débogage, consulter les documentations officielles et utiliser les meilleurs outils de test d'API.
| Domaine | Librairie | Pourquoi l'utiliser ? |
|---|---|---|
| HTTP Client | httpx |
Successeur moderne de requests, gère le async nativement. |
| Validation | pydantic |
La référence pour la validation de données par types. |
| Sécurité | passlib[argon2] |
Le standard pour le hashing sécurisé des mots de passe. |
| Utils | python-dotenv |
Indispensable pour charger ses fichiers .env. |
L'alternative moderne à curl en ligne de commande. Coloré et intuitif.
Des alternatives légères et souvent open-source à Postman pour tester vos endpoints REST/GraphQL.
L'onglet Network de votre navigateur est votre meilleur ami pour inspecter les
requêtes
HTTP.
# Créer et activer un venv python -m venv .venv source .venv/bin/activate # Linux .venv\Scripts\activate # Windows # Gérer les packages pip install -r requirements.txt pip freeze > requirements.txt
# Lancer la stack complète docker-compose up --build # Voir les logs en direct docker logs -f my_app_container # Accéder à la DB docker exec -it db_cont psql -U user
Clair, complet et pédagogique.
La référence absolue, extrêmement détaillée.
Interactive et remplie d'exemples "live".
Pour aller plus loin, consultez le dépôt GitHub Awesome Python qui liste les meilleures librairies pour chaque besoin imaginable.