Aller au contenu principal

Stack : Python + FastAPI + SQLAlchemy

Configuration pour .cursorrules ou CLAUDE.md

Langage et version

  • Python 3.11
  • Type hints obligatoires (strict mode mypy)
  • Pydantic v2 pour validation

Framework principal

  • FastAPI pour API REST
  • Async/await obligatoire (pas de code bloquant)
  • Tous les endpoints doivent avoir une dépendance Depends()

Base de données

  • SQLAlchemy ORM (pas de raw SQL)
  • Alembic pour migrations
  • Connexion async avec asyncpg

Exemple de pattern : Endpoint avec dépendances

# db: AsyncSession est TOUJOURS injecté par Depends()
# user: User est TOUJOURS validé et actif
# request_data est TOUJOURS validé via Pydantic

@router.post("/users", response_model=UserResponse)
async def create_user(
request: CreateUserRequest, # Pydantic
db: AsyncSession = Depends(get_db), # Injection DB
current_user: User = Depends(get_current_user), # Auth
) -> UserResponse:
"""Créer un nouvel utilisateur.

Seuls les admins peuvent créer des users.
"""
if not current_user.is_admin:
raise HTTPException(status_code=403, detail="Admin required")

user = User(**request.dict())
db.add(user)
await db.commit()
return user

Test : Même approche avec pytest-asyncio

# tests/test_users.py

@pytest.mark.asyncio
async def test_create_user_success(db_session):
"""Tester création d'user valide."""
response = await client.post(
"/users",
json={"email": "test@example.com", "name": "Test"},
headers={"Authorization": f"Bearer {admin_token}"}
)
assert response.status_code == 201
assert response.json()["email"] == "test@example.com"

Checklist pour tout code Python

  • Type hints complets
  • Docstring au format Google
  • Async/await si I/O (DB, HTTP)
  • Gestion erreurs : HTTPException, ValidationError
  • Logs avec contexte (pas de données sensibles)
  • Tests : 1 success + 1 error case minimum