AkamaSoft

FastAPI est un framework Python moderne qui permet de créer des API REST performantes et sécurisées. Dans ce guide avancé, vous apprendrez à créer une API complète connectée à PostgreSQL, avec authentification JWT, CRUD complet et intégration avec un frontend React ou Flutter.

Chez Akamasoft, nous utilisons cette approche pour construire des API robustes, évolutives et prêtes pour la production.


1. Architecture de l’API

[ Frontend React / Flutter ]
           |
           v
       [ NGINX / Reverse Proxy ]
           |
        [ FastAPI ]
           |
[ PostgreSQL / Redis (cache)]

Cette architecture permet de gérer un grand volume de requêtes tout en assurant sécurité et performance.


2. Prérequis

  • Python 3.9 ou plus
  • PostgreSQL installé
  • Environnement virtuel
  • Éditeur de code (VS Code recommandé)
  • Connaissances de base en Python

3. Installation des dépendances


pip install fastapi uvicorn psycopg2-binary sqlalchemy
pip install python-jose passlib[bcrypt] python-multipart

4. Configuration de la base de données PostgreSQL


DATABASE_URL = "postgresql://user:password@localhost:5432/akamasoftdb"

Création des tables avec SQLAlchemy :


from sqlalchemy import Column, Integer, String, Float
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Produit(Base):
    __tablename__ = "produits"
    id = Column(Integer, primary_key=True, index=True)
    nom = Column(String, unique=True, index=True)
    description = Column(String)
    prix = Column(Float)

5. Authentification JWT sécurisée


from datetime import datetime, timedelta
from jose import JWTError, jwt
from passlib.context import CryptContext

SECRET_KEY = "VOTRE_SECRET_KEY"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

Création d’un token :


def create_access_token(data: dict, expires_delta: timedelta = None):
    to_encode = data.copy()
    expire = datetime.utcnow() + (expires_delta if expires_delta else timedelta(minutes=15))
    to_encode.update({"exp": expire})
    encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
    return encoded_jwt

Cette méthode sécurise l’accès aux endpoints sensibles.


6. CRUD complet pour les produits


from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
from .database import SessionLocal, engine
from .models import Base, Produit
from .schemas import ProduitCreate, ProduitRead
from typing import List

app = FastAPI(title="API Akamasoft sécurisée")

Base.metadata.create_all(bind=engine)

# Dépendance pour obtenir la session DB
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.post("/produits/", response_model=ProduitRead)
def creer_produit(produit: ProduitCreate, db: Session = Depends(get_db)):
    db_produit = Produit(nom=produit.nom, description=produit.description, prix=produit.prix)
    db.add(db_produit)
    db.commit()
    db.refresh(db_produit)
    return db_produit

@app.get("/produits/", response_model=List[ProduitRead])
def lire_produits(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
    produits = db.query(Produit).offset(skip).limit(limit).all()
    return produits

7. Sécurisation des endpoints avec JWT


from fastapi.security import OAuth2PasswordBearer

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

def verifier_token(token: str = Depends(oauth2_scheme)):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        return payload
    except JWTError:
        raise HTTPException(status_code=401, detail="Token invalide")

Ajoutez `Depends(verifier_token)` à toutes les routes sécurisées.

---

8. Connexion avec un frontend React ou mobile Flutter

Exemple JavaScript (React)


fetch("http://127.0.0.1:8000/produits/", {
  headers: { "Authorization": "Bearer VOTRE_JWT" }
})
.then(res => res.json())
.then(data => console.log(data));

Exemple Flutter


var response = await http.get(
  Uri.parse("http://127.0.0.1:8000/produits/"),
  headers: {"Authorization": "Bearer $jwtToken"},
);

---

9. Optimisation et scalabilité

  • Utiliser l’asynchrone pour les opérations longues
  • Mise en cache avec Redis
  • Docker + Nginx pour le déploiement en production
  • Load Balancer pour la montée en charge
[ Frontend React / Flutter ]
           |
       [ NGINX / Reverse Proxy ]
           |
        [ FastAPI ]
           |
[ PostgreSQL / Redis (cache)]

---

10. Bonnes pratiques de sécurité

  • Activer HTTPS
  • Valider toutes les entrées utilisateurs
  • Limiter les permissions
  • Mettre à jour régulièrement les dépendances
  • Journaliser et monitorer les accès à l’API

---

Conclusion

Vous savez maintenant créer une API REST sécurisée et complète avec FastAPI et PostgreSQL, gérer un CRUD complet, sécuriser les endpoints avec JWT et connecter votre API à un frontend web ou mobile.

Chez Akamasoft, nous accompagnons les entreprises dans le développement d’API modernes, sécurisées et scalables, prêtes à répondre aux besoins du marché africain et international.

Guide Expert : Créer une API REST Professionnelle avec FastAPI, PostgreSQL et Docker

Passer d'un prototype à une API prête pour la production demande de la rigueur : gestion des migrations, asynchronisme, conteneurisation et sécurité renforcée. Ce guide détaille l'approche utilisée par les experts pour bâtir des systèmes scalables.


1. Architecture Modulaire (Pattern Repository)

Pour maintenir un code propre, nous séparons les responsabilités. Ne mélangez jamais vos requêtes SQL avec vos routes API.

  • Schemas (Pydantic) : Validation des données d'entrée/sortie.
  • Models (SQLAlchemy) : Définition des tables de la base de données.
  • Repository : Logique d'accès aux données (CRUD).
  • Routers : Points d'entrée (Endpoints) de l'API.

2. Performance : L'Asynchronisme avec SQLAlchemy 2.0

FastAPI brille par sa gestion de l'asynchrone. Utilisez asyncpg pour des performances optimales avec PostgreSQL.

from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker

DATABASE_URL = "postgresql+asyncpg://user:pass@db:5432/dbname"

engine = create_async_engine(DATABASE_URL, echo=False)
AsyncSessionLocal = async_sessionmaker(engine, expire_on_commit=False, class_=AsyncSession)

# Dépendance injectée dans les routes
async def get_db():
    async with AsyncSessionLocal() as session:
        yield session

3. Gestion des Migrations avec Alembic

En production, modifier manuellement votre base de données est proscrit. Alembic versionne vos schémas.

  1. Initialisation : alembic init migrations
  2. Génération automatique : Alembic compare vos modèles Python à votre base de données.
    alembic revision --autogenerate -m "Initialisation"
  3. Application : alembic upgrade head
Note : Cela permet de revenir en arrière (rollback) instantanément en cas d'erreur de schéma.

4. Conteneurisation avec Docker & Orchestration

L'utilisation de Docker Compose garantit que votre API fonctionne exactement de la même manière en développement et en production.

Fichier docker-compose.yml

version: '3.8'
services:
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data

  api:
    build: .
    command: sh -c "alembic upgrade head && uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 4"
    env_file:
      - .env
    depends_on:
      - db

volumes:
  postgres_data:

5. Sécurité : JWT et Hachage Argon2

Ne stockez jamais de mots de passe en clair. Utilisez Argon2 ou Bcrypt. Pour l'authentification, le flux OAuth2 avec jeton JWT est la norme.

  • Rotation des clés : Utilisez des variables d'environnement pour vos SECRET_KEY.
  • Expiration : Limitez la durée de vie des tokens (ex: 30 minutes) et utilisez des Refresh Tokens pour la persistance.

6. Bonnes Pratiques de Production

Concept Solution Pro
Gestion d'erreurs Handler global pour renvoyer du JSON uniforme.
Validation Pydantic V2 pour des performances de parsing 10x plus rapides.
Reverse Proxy Nginx ou Traefik pour le SSL (HTTPS) et le Load Balancing.

Conclusion

Développer une API avec FastAPI et PostgreSQL ne se limite pas à écrire quelques routes. En intégrant Alembic pour vos données et Docker pour votre infrastructure, vous créez une base solide, maintenable et prête pour la mise à l'échelle.

Chez Akamasoft, nous appliquons ces standards pour garantir la robustesse des solutions digitales de nos partenaires.

Auteur: Mvondo bekey anael sixako

ceo | founder
COMPETENCES
  • • Maitrise des environnements Unix, Linux, Mac, Windows, IOS et Android
  • • Programmation Orientée Objet : Python, Ruby, C++, Java, PHP, Js
  • • Certifier linux Lpi (101, 102, 202, 203, 301, 303)
  • • Certifier Adwords Professional , Certifier Ceh (6, 7, 8, 9, 10, 11)
  • • Maîtrise parfaite de : Docker, VMware sphère, Microsoft Hyper, Citrix, Virtual box,promox vm
Annonce