Déployer une API FastAPI
FastAPI s'appuie sur ASGI et Uvicorn pour servir une API asynchrone, avec validation des données et documentation générée. Sur l'hébergement d'applications, le déploiement se résume à un point d'entrée qui lit PORT, écoute sur 0.0.0.0 et démarre Uvicorn sans mode rechargement.
Application
import os
import uvicorn
from fastapi import FastAPI
app = FastAPI(title="API exemple")
@app.get("/health")
def health():
return {"status": "ok"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str | None = None):
return {"item_id": item_id, "q": q}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=int(os.environ.get("PORT", "8000")))La syntaxe str | None demande Python 3.10 ou plus récent. Sur Python 3.9, utilisez Optional[str] importé depuis typing.
requirements.txt :
fastapi==0.115.0
uvicorn[standard]==0.30.6Lancer Uvicorn
uvicorn.run(app, ...) fonctionne avec l'objet application. Si vous utilisez la ligne de commande, passez une chaîne d'import :
uvicorn main:app --host 0.0.0.0 --port $PORTN'activez pas --reload en production : le rechargement surveille les fichiers, consomme de la mémoire et redémarre le processus à chaque modification. Pour plusieurs workers, utilisez la forme avec chaîne d'import et --workers ; chaque worker est un processus séparé.
Documentation et validation
FastAPI expose /docs, /redoc et /openapi.json. Utile en développement, parfois indésirable en production : désactivez-les avec FastAPI(docs_url=None, redoc_url=None) si l'API n'est pas publique, ou protégez-les par authentification.
Les modèles Pydantic valident les entrées et documentent le contrat. Un champ manquant renvoie 422 avec le détail, ce qui est préférable à une erreur 500. Utilisez response_model pour éviter de renvoyer des champs internes comme un hash de mot de passe.
Sécurité et robustesse
- Limitez la taille des corps et le nombre de champs.
- Validez les types avant d'atteindre la base.
- Configurez CORS avec des origines explicites, pas
*avec des identifiants. - Journalisez les erreurs sans exposer la pile au client.
- Fermez les connexions (base, client HTTP) à l'arrêt.
Vérifier
curl -i http://ADRESSE_FOURNIE:PORT/health
curl -i http://ADRESSE_FOURNIE:PORT/items/42
curl -i http://ADRESSE_FOURNIE:PORT/items/abcAttendez 200 pour /health et /items/42, 422 pour /items/abc. Le journal doit afficher Uvicorn running on http://0.0.0.0:PORT. Si le processus démarre mais que la requête échoue, vérifiez l'interface et le port avant les routes.
Adapter la commande de démarrage
Dans le panneau, remplacez la commande par uvicorn main:app --host 0.0.0.0 --port $PORT. Si l'offre limite la mémoire, restez à un seul worker : chaque worker Uvicorn charge une copie complète de l'application. Pour une charge réelle, mesurez d'abord la mémoire disponible et la consommation au repos avant d'augmenter --workers. Après le redémarrage, vérifiez la route /health et la présence de Uvicorn running dans les logs.
Publicité
Cet article vous a-t-il aidé ?
À lire aussi
- Déployer une application FlaskLancer Flask sur le port fourni, sans debug, avec une route de santé.
- Héberger un bot Discord PythonConfigurer discord.py, les intents, la reconnexion et la protection du jeton.
- Configurer une application PythonDéfinir main.py, les dépendances, le port et les variables d'une application Python.