FastAPI — Cheat Sheet

Tag: python, fastapi, pydantic, starlette, async, rest-api, uvicorn

Livello: intermedio

TL;DR: Web framework Python asincrono ad alte prestazioni basato su Starlette e Pydantic per costruire API REST con validazione automatica e documentazione OpenAPI.

Concetti chiave

Basato su standard aperti: OpenAPI, JSON Schema e Starlette per il routing ASGI.

Validazione dati, parsing e serializzazione basati sui modelli Pydantic.

Supporto nativo per concorrenza asincrona con async def ed esecuzione threadpool per def sincroni.

Sistema di Dependency Injection potente tramite Depends per auth, database session e logica riutilizzabile.

Generazione automatica della documentazione interattiva su percorsi /docs (Swagger UI) e /redoc (ReDoc).

Type hints standard di Python usati per validazione parametri, query, headers e body.

Gestione integrata del ciclo di vita applicativo tramite il context manager lifespan.

Domande tipiche e risposte pronte

Q: Qual e' la differenza tra dichiarare un endpoint con async def rispetto a def?R: Uso async def per operazioni non bloccanti basate su coroutine e librerie asincrone; uso def classico quando invoco librerie sincrone o bloccanti, poiche' FastAPI le esegue automaticamente in un threadpool separato evitando di bloccare l'event loop.

Q: Come gestisci l'autenticazione e la sessione DB in modo modulare?R: Sfrutto la Dependency Injection con Depends: definisco generatori per il ciclo di vita delle sessioni DB e dipendenze per estrarre e validare JWT o bearer token dall'header HTTP prima di inoltrare la richiesta ai controller.

Insidie e errori comuni

Invocare funzioni bloccanti o sync I/O dentro endpoint definiti con async def, saturando l'event loop principale.

Confondere le classi BaseModel di Pydantic v1 con la sintassi e i metodi modificati in Pydantic v2.

Omettere l'uso di yield nei generatori passati a Depends, causando mancate chiusure di connessioni o sessioni aperte.

Usare argomenti di default mutabili dentro i modelli o nei parametri di route.

Snippet e comandiBash

```pip install "fastapi[standard]" uvicorn

uvicorn main:app --reload --host 0.0.0.0 --port 8000

from fastapi import FastAPI, Depends, HTTPException, status

from pydantic import BaseModel, Field

app = FastAPI(title="Core API")

class ItemSchema(BaseModel):

name: str = Field(..., min_length=1)

price: float = Field(..., gt=0.0)

async def verify_token(token: str = "secret-token"):

if token != "secret-token":

raise HTTPException(

status_code=status.HTTP_401_UNAUTHORIZED,

detail="Invalid credentials"

)

return token

@app.post("/items/", status_code=status.HTTP_201_CREATED)

async def create_item(item: ItemSchema, auth: str = Depends(verify_token)):

return {"status": "ok", "data": item.model_dump()}

```

Da ripassare

[ ] Gestione eventi di avvio e chiusura con lifespan anziche' i deprecati @app.on_event.

[ ] Pattern di dependency injection con sub-dependencies annidate.

[ ] BackgroundTasks nativi rispetto a code distribuite come Celery o Redis Queue.

[x] Tipizzazione Pydantic v2 e validatori con @field_validator.

Riferimenti

Documentazione ufficiale FastAPI (fastapi.tiangolo.com)

Pydantic Documentation (docs.pydantic.dev)

Starlette Toolkit (starlette.io)

Jarvis Interviews
Jarvis