Pourquoi Déployer FastAPI sur Heroku ?
Le déploiement d'application FastAPI sur Heroku est un choix populaire pour les développeurs car il permet une mise en production rapide et facile, avec des fonctionnalités telles que l'échelle automatique, la sauvegarde régulière des données et le support du système d'exploitation Linux. Un cas concret serait l'application de gestion de tâches ou un API de blog qui nécessite une haute disponibilité et une scalabilité.
Prerequis
Avant de commencer ce tutoriel, vous devriez disposer des connaissances suivantes :
- Connaissance approfondie de FastAPI
- Familiarité avec Python 3.7+
- Connaissances en gestion de paquets (pip)
- Une compte Heroku active
Vous aurez également besoin d'installer les outils suivants :
- Git (version 2.18+)
- Python 3.7+
- pip
- Heroku CLI
Concepts fondamentaux
Schema mental : FastAPI sur Heroku
Le processus de déploiement FastAPI sur Heroku implique plusieurs étapes clés :
- Création du projet : Initialisation du projet avec FastAPI.
- Configuration de l'environnement : Création d'un fichier
requirements.txtpour gérer les dépendances Python. - Création du fichier startup : Configuration de l'application pour qu'elle puisse démarrer correctement sur Heroku.
- Initialisation du dépôt Git : Préparation du projet pour le déploiement via Git.
- Déploiement via la ligne de commande : Utilisation de l'interface CLI Heroku pour déployer l'application.
Exemple de Code
## main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Bienvenue sur mon API FastAPI"}
Mise en pratique : Projet fil rouge
Nous allons construire un mini-projet complet : un simple gestionnaire de tâches. Ce projet comprendra des routes pour ajouter, récupérer et supprimer des tâches.
Étape 1 : Initialiser le projet
mkdir todo-fastapi-heroku
cd todo-fastapi-heroku
Étape 2 : Créer le fichier requirements.txt
pip install fastapi uvicorn
echo "fastapi" >> requirements.txt
echo "uvicorn[standard]" >> requirements.txt
Étape 3 : Créer la structure du projet
mkdir app
touch app/main.py
Étape 4 : Ajouter le code de l'application
app/main.py
from fastapi import FastAPI, HTTPException
from typing import List, Optional
from pydantic import BaseModel
app = FastAPI()
## Mock data for tasks
tasks = []
class Task(BaseModel):
id: int
title: str
completed: bool = False
@app.post("/tasks/", response_model=Task)
def create_task(task: Task):
task.id = len(tasks) + 1
tasks.append(task)
return task
@app.get("/tasks/", response_model=List[Task])
def read_tasks():
return tasks
@app.get("/tasks/{task_id}", response_model=Task)
def read_task(task_id: int):
for task in tasks:
if task.id == task_id:
return task
raise HTTPException(status_code=404, detail="Task not found")
@app.put("/tasks/{task_id}", response_model=Task)
def update_task(task_id: int, completed: Optional[bool] = None):
for i, task in enumerate(tasks):
if task.id == task_id:
if completed is not None:
tasks[i].completed = completed
return tasks[i]
raise HTTPException(status_code=404, detail="Task not found")
@app.delete("/tasks/{task_id}", response_model=Task)
def delete_task(task_id: int):
for i, task in enumerate(tasks):
if task.id == task_id:
deleted_task = tasks.pop(i)
return deleted_task
raise HTTPException(status_code=404, detail="Task not found")
Étape 5 : Créer le fichier Procfile
Heroku utilise un fichier Procfile pour spécifier les commandes nécessaires pour démarrer votre application.
echo "web: uvicorn app.main:app --host=0.0.0.0 --port=$PORT" > Procfile
Étape 6 : Initialiser le dépôt Git
git init
git add .
git commit -m "Initial commit"
Erreurs fréquentes et debugging
- Erreur : Le service n'est pas disponible
Code incorrect
## app/main.py
from fastapi import FastAPI, HTTPException
app = FastAPI()
@app.get("/")
def read_root():
raise Exception("Une erreur s'est produite")
Code correct
## app/main.py
from fastapi import FastAPI, HTTPException
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Bienvenue sur mon API FastAPI"}
- Erreur : Le service ne répond pas
Code incorrect
## Procfile
web: uvicorn app.main:app --host=0.0.0.0 --port=$PORT
Code correct
## Procfile
web: uvicorn app.main:app --host=0.0.0.0 --port=$PORT
- Erreur : Le service ne démarre pas
Code incorrect
## main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Bienvenue sur mon API FastAPI"}
Code correct
## main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Bienvenue sur mon API FastAPI"}
Pour aller plus loin
- Intégration avec une base de données : Utilisez SQLAlchemy pour gérer des tâches en base de données.
- Ajout d'authentification : Utilisez OAuth2 pour sécuriser votre API.
- Déploiement continu (CI/CD) : Configurez GitHub Actions pour automatiser le déploiement sur Heroku.
Défi pratique
- Créer une application de gestion de contacts : Implémentez des routes pour ajouter, récupérer et supprimer des contacts avec des informations comme le nom, l'email et le numéro de téléphone.