FastAPI è un moderno framework Python per costruire API rapidamente, con type hint, validazione e documentazione OpenAPI automatica. Scopri le basi e gli usi.

FastAPI è un framework Python per costruire API web rapidamente, con codice chiaro e documentazione automatica. Scrivi piccole funzioni (chiamate “endpoint”) che dichiarano quali dati accetta la tua API e cosa restituisce, e FastAPI si occupa dell'infrastruttura web—routing, validazione e produzione di risposte JSON.
Un'API è un insieme di URL che permette a un pezzo di software di parlare con un altro.
Per esempio, un'app meteo sul telefono potrebbe chiamare un URL tipo GET /weather?city=Berlin. Il server risponde con dati strutturati (di solito JSON), come temperatura e previsione. L'app non ha bisogno di accesso diretto al database del server—chiede semplicemente all'API e mostra il risultato.
FastAPI ti aiuta a creare quegli URL e quelle risposte in Python.
Non è necessario essere esperti di async per iniziare; puoi scrivere endpoint semplici e adottare pattern più avanzati man mano che cresci.
FastAPI è decollato rapidamente perché elimina molte delle frizioni quotidiane che si incontrano costruendo API in Python.
I progetti API tradizionali spesso iniziano con una configurazione lenta e tanto “plumbing”:
Le funzionalità principali di FastAPI mirano direttamente a questi problemi, così i team passano più tempo a progettare endpoint e meno a combattere il boilerplate del framework.
FastAPI fa grande uso dei type hint di Python. Quando dichiari che un campo è un int, opzionale o una lista di qualcosa, FastAPI usa quelle informazioni per validare gli input e modellare gli output.
Questo riduce gli errori da “stringly-typed” (per esempio trattare un ID come testo in un punto e come numero in un altro) e incoraggia comportamenti coerenti degli endpoint. È sempre Python, ma con aspettative più chiare incise nelle firme delle funzioni.
Poiché lo schema dell'API viene ricavato dal codice, FastAPI può generare documentazione interattiva automaticamente (OpenAPI + Swagger UI/ReDoc). Questo è importante per la collaborazione: frontend, QA e integratori possono esplorare gli endpoint, provare richieste e vedere i modelli esatti senza aspettare una documentazione separata.
FastAPI non risolverà un'API progettata male. Serve comunque una buona denominazione, versioning, gestione degli errori e decisioni di sicurezza. Ciò che offre è un percorso più pulito dall'“idea” a un'“API ben definita” con meno sorprese.
FastAPI sembra semplice una volta che capisci alcune idee fondamentali su cui si basa. Non serve memorizzare gli interni—basta riconoscere le parti che userai ogni giorno.
Un framework è un insieme di strumenti e convenzioni per costruire un'API senza partire da zero. FastAPI fornisce il “plumbing” per i compiti comuni delle API: definire endpoint, leggere input, restituire output, gestire errori e organizzare il codice in modo mantenibile.
Routing è come mappi un URL e un metodo HTTP a un pezzo di codice Python.
Per esempio, potresti mappare GET /users a “lista utenti” e POST /users a “crea un utente”. In FastAPI, definisci tipicamente le rotte con decorator come @app.get(...) e @app.post(...), rendendo facile vedere cosa offre la tua API a colpo d'occhio.
Ogni chiamata API è una request (quello che il client invia) e una response (quello che il server restituisce).
FastAPI ti aiuta a:
/users/{id}), query string (?page=2), header e body della richiesta200, 201, 404)FastAPI gira su ASGI, uno standard moderno per server web Python. Nella pratica significa che FastAPI è progettato per gestire molte connessioni in modo efficiente e può supportare funzionalità come connessioni a lunga durata (es. WebSockets) senza che tu debba gestire il networking a basso livello.
I type hint di Python (come str, int, list[Item]) non sono solo documentazione in FastAPI—sono un input chiave. FastAPI li usa per capire quali dati aspettarsi, convertire i valori in arrivo nei tipi corretti e produrre API più chiare e prevedibili.
I modelli Pydantic ti permettono di definire la forma dei dati (campi, tipi, valori opzionali) in un solo posto. FastAPI usa questi modelli per validare il JSON in ingresso, rifiutare input non validi con messaggi di errore utili e serializzare l'output in modo coerente—così la tua API si comporta in modo affidabile anche quando i client inviano dati disordinati.
Le app FastAPI si basano su endpoint: un percorso URL più un metodo HTTP. Pensa a un endpoint come "cosa chiede il client" e "come lo chiede". Per esempio, un client potrebbe GET /users per elencare utenti, o POST /users per crearne uno.
Un path è la rotta e il method è l'azione:
GET /products → recuperare datiPOST /products → inviare dati per creare qualcosaPUT /products/123 → sostituire/aggiornare qualcosaDELETE /products/123 → rimuovere qualcosaFastAPI separa i dati che fanno parte del path dai dati che sono filtri opzionali sulla richiesta.
GET /users/42 → 42 è l'ID utente.? e tipicamente opzionale.
GET /users?limit=10&active=true → limit e active controllano come vengono restituiti i risultati.Quando un client invia dati strutturati (di solito JSON), questi vanno nel body della richiesta, più spesso con POST o PUT.
Esempio: POST /orders con JSON come { "item_id": 3, "quantity": 2 }.
FastAPI può restituire oggetti Python semplici (come dict), ma dà il meglio quando definisci un response model. Quel modello funge da contratto: i campi sono coerenti, i dati extra possono essere filtrati e i tipi vengono applicati. Il risultato sono API più pulite—i client sanno cosa aspettarsi e si evitano risposte “a sorpresa” che rompono le integrazioni.
“Async” (abbreviazione di asynchronous) è un modo per la tua API di gestire molte richieste in modo efficiente quando gran parte del tempo è spesa in attesa.
Immagina un barista che prende ordini. Se dovesse stare fermo a non fare nulla mentre la macchina del caffè gira, servirebbe meno clienti. Un approccio migliore è: avvia il caffè, poi prendi il prossimo ordine mentre la macchina lavora.
L'async funziona così. La tua app FastAPI può avviare un'operazione che aspetta qualcosa di lento—come una richiesta di rete o una query al database—e mentre aspetta, può passare a gestire altre richieste in arrivo.
L'async è utile quando la tua API fa molto lavoro di I/O (input/output)—operazioni che passano tempo in attesa più che a “elaborare”. Esempi comuni:
Se i tuoi endpoint passano spesso tempo in queste operazioni, l'async può migliorare il throughput e ridurre il rischio che le richieste si accumulino sotto carico.
L'async non è una bacchetta magica per tutto. Se il tuo endpoint è principalmente CPU-bound—ad es. ridimensionare immagini grandi, eseguire calcoli di data science o cifrare payload pesanti—l'async non accelererà l'elaborazione stessa. In quei casi servono tattiche diverse (background worker, process pool o scalare orizzontalmente).
Non devi riscrivere tutto per usare FastAPI. Puoi scrivere funzioni di route normali (sincrone) e FastAPI le eseguirà correttamente. Molti progetti mescolano entrambi gli stili: mantieni semplici endpoint sincroni e usa async def dove aiuta chiaramente (di solito intorno a chiamate DB o HTTP esterne).
La validazione è il checkpoint tra il mondo esterno e il tuo codice. Quando un'API accetta input (body JSON, query params, path params), vuoi essere sicuro che sia completo, del tipo corretto e entro limiti ragionevoli—prima di scrivere su un DB, chiamare un altro servizio o attivare la logica di business.
FastAPI si affida ai modelli Pydantic per questo. Descrivi cosa significa “dati buoni” una sola volta e FastAPI automaticamente:
Se un client invia dati con forma sbagliata, FastAPI risponde con 422 Unprocessable Entity e un payload di errore strutturato che indica il campo esatto e il motivo. Questo facilita il lavoro degli sviluppatori client per correggere le richieste rapidamente, senza dover indovinare.
Ecco un piccolo modello che mostra campi richiesti, tipi, vincoli min/max e formati:
from pydantic import BaseModel, EmailStr, Field
class UserCreate(BaseModel):
email: EmailStr
age: int = Field(ge=13, le=120)
username: str = Field(min_length=3, max_length=20)
email deve essere presente.age deve essere un intero.age è limitato a 13–120.EmailStr impone una forma valida di email.Gli stessi modelli possono modellare l'output, così le risposte dell'API non filtrano accidentalmente campi interni. Restituisci oggetti Python; FastAPI (tramite Pydantic) li converte in JSON con i nomi dei campi e i tipi corretti.
Una delle caratteristiche più pratiche di FastAPI è che genera la documentazione dell'API automaticamente—basata sul codice che hai già scritto.
OpenAPI è uno standard per descrivere un'API in formato strutturato (di solito JSON). Pensalo come un “contratto” che specifica:
GET /users/{id})Poiché è leggibile da strumenti, può essere usato per generare client, validare richieste e mantenere i team allineati.
FastAPI serve automaticamente due pagine di documentazione umano-friendly:
In un progetto FastAPI tipico li trovi su:
/docs (Swagger UI)/redoc (ReDoc)Quando cambi path parameter, request model, response model o regole di validazione, lo schema OpenAPI (e le pagine di docs) si aggiornano automaticamente. Nessun passo separato di “manutenzione docs”.
Un'app FastAPI può essere piccola e comunque sentirsi “reale”. Definisci un oggetto Python chiamato app, aggiungi un paio di route e avvia un server locale per provarlo nel browser.
Ecco l'esempio più piccolo utile:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI"}
Questo è tutto: una rotta (GET /) che restituisce JSON.
Per farlo sembrare una vera API, memorizziamo gli item in una lista. Non è un database—i dati si resettano al riavvio del server—ma è perfetto per imparare.
from fastapi import FastAPI
app = FastAPI()
items = []
@app.post("/items")
def create_item(name: str):
item = {"id": len(items) + 1, "name": name}
items.append(item)
return item
@app.get("/items")
def list_items():
return items
Ora puoi:
POST /items?name=Coffee per aggiungere un elementoGET /items per recuperare la listaUna struttura di partenza comune è:
main.py (crea app e le route)requirements.txt o pyproject.toml (dipendenze)Di solito:
uvicorn main:app --reload)http://127.0.0.1:8000 e prova gli endpointLe “dependency” di FastAPI sono input condivisi di cui i tuoi endpoint hanno bisogno—cose come la sessione del database, l'utente corrente, le impostazioni dell'app o parametri di query comuni. Invece di ricreare o parsare tutto in ogni route, le definisci una volta e FastAPI le fornisce dove servono.
Una dependency è di solito una funzione (o classe) che restituisce un valore che il tuo endpoint può usare. FastAPI la chiamerà per te, capirà di cosa ha bisogno (in base ai suoi parametri) e inietterà il risultato nella funzione dell'operazione di percorso.
Questo è spesso chiamato dependency injection, ma puoi pensarci come: “dichiara ciò di cui hai bisogno e FastAPI lo collega”.
Senza dependency, potresti:
Con le dependency centralizzi quella logica. Se poi cambi come creare una sessione DB o come caricare l'utente corrente, aggiorni un solo posto—non dozzine di endpoint.
page/limit.Ecco il pattern concettuale che vedrai in molte app FastAPI:
from fastapi import Depends, FastAPI
app = FastAPI()
def get_settings():
return {"items_per_page": 20}
@app.get("/items")
def list_items(settings=Depends(get_settings)):
return {"limit": settings["items_per_page"]}
Dichiari la dependency con Depends(...) e FastAPI passa il suo risultato nel parametro dell'endpoint. Lo stesso approccio funziona per building block più complessi (come get_db() o get_current_user()), aiutando il codice a rimanere più pulito man mano che l'API cresce.
FastAPI non “autoprotegge” l'API—scegli lo schema e integralo negli endpoint. La buona notizia è che FastAPI fornisce mattoni (specialmente tramite il sistema di dependency) che rendono semplici i pattern di sicurezza comuni.
Autenticazione risponde: “Chi sei?” Autorizzazione risponde: “Cosa puoi fare?”
Esempio: un utente può essere autenticato (login/token valido) ma non autorizzato ad accedere a una rotta solo per admin.
X-API-Key). Gestire rotazione e revoca.FastAPI supporta questi pattern tramite utility come fastapi.security e li documenta chiaramente in OpenAPI.
Se memorizzi password utente, mai salvare in testo semplice. Conserva un hash salato e lento (es. bcrypt/argon2 tramite una libreria consolidata). Considera anche rate limiting e politiche di lockout degli account.
La sicurezza dipende dai dettagli: storage dei token, impostazioni CORS, HTTPS, gestione dei segreti e controlli di autorizzazione corretti su ogni endpoint sensibile. Usa i helper integrati come punto di partenza e verifica l'approccio con revisioni e test prima di affidarti a una soluzione in produzione.
I test sono dove la promessa “funziona sulla mia macchina” diventa fiducia per la produzione. La buona notizia: FastAPI è costruito su Starlette, quindi ottieni ottimi strumenti di test senza molte configurazioni.
Unit test si concentrano su pezzi piccoli: una funzione che calcola un valore, una dependency che carica l'utente corrente, o un metodo di servizio che parla con il DB (spesso mockato).
Integration test esercitano l'API end-to-end: chiami un endpoint e asserti sulla risposta HTTP completa. Questi test individuano errori di routing, wiring delle dependency e problemi di validazione.
Una suite sana ha più unit test (veloci) e meno integration test (maggiore fiducia).
Le app FastAPI possono essere testate “come un client” usando il TestClient di Starlette, che invia richieste all'app in-process—nessun server necessario.
from fastapi.testclient import TestClient
from app.main import app
client = TestClient(app)
def test_healthcheck():
r = client.get("/health")
assert r.status_code == 200
Testa le cose su cui utenti e altri sistemi contano:
Usa dati prevedibili, isola servizi esterni (mock o DB di test) ed evita stato condiviso tra test. I test veloci vengono eseguiti; quelli lenti vengono saltati.
Mettere online un'app FastAPI riguarda soprattutto scegliere il “runner” giusto e aggiungere alcune cose essenziali per la produzione.
Quando esegui uvicorn main:app --reload localmente, stai usando una configurazione di sviluppo: reload automatico, errori verbosi e impostazioni comode.
In produzione normalmente esegui Uvicorn senza reload, spesso dietro a un process manager (es. Gunicorn con worker Uvicorn) o dietro un reverse proxy. L'obiettivo è stabilità: riavvii controllati, performance prevedibili e default più sicuri.
Un pattern comune è:
Questo permette di distribuire lo stesso codice in più ambienti senza modificare file.
Prima di dichiarare “fatto”, assicurati di avere:
/health per monitoraggio e bilanciatori.Se passi da “funziona in locale” a “pronto per la produzione”, aiuta standardizzare come generi e gestisci il contratto API. Alcuni team affiancano l'output OpenAPI di FastAPI a workflow automatizzati—ad esempio generare client, validare richieste in CI e distribuire con processi coerenti. Strumenti come Koder.ai possono inserirsi qui: puoi descrivere l'API che vuoi in chat, iterare sugli endpoint e i modelli rapidamente, e poi esportare il codice sorgente per una normale revisione/deploy.
FastAPI è una scelta solida quando vuoi un modo moderno e pulito per costruire API REST in Python—soprattutto se tieni alla chiarezza di request/response e al comportamento prevedibile mentre l'API cresce.
FastAPI tende a brillare in queste situazioni:
FastAPI non è sempre la risposta più semplice:
FastAPI può essere molto veloce nella pratica, ma la velocità dipende da chiamate al DB, latenza di rete e logica di business. Aspettati buon throughput e latenze adeguate per carichi API tipici—ma non contare sul framework per risolvere I/O lento o query inefficienti.
Se FastAPI ti sembra adatto, concentrati su pattern di routing, modelli Pydantic, integrazione col database, task in background e autenticazione di base.
Un percorso pratico è costruire un piccolo set di endpoint, poi espandere con dependency riutilizzabili e test man mano che l'API cresce. Se vuoi accelerare la scaffolding iniziale (route, modelli e struttura pronta per il deploy), considera un workflow di prototipazione—ad esempio mappare gli endpoint in una “planning mode” e iterare da una singola specifica. È un'area dove Koder.ai può essere utile: puoi prototipare un'app guidata da API via chat, affinare il codice generato ed esportarlo quando sei pronto a eseguirlo come un normale progetto.
FastAPI è un framework web Python per costruire API con il minimo boilerplate. Scrivi funzioni endpoint (come @app.get("/users")) e FastAPI si occupa di routing, parsing delle richieste, validazione e risposte JSON.
Un vantaggio chiave è che i tuoi type hint e i modelli Pydantic fanno da contratto esplicito su cosa l'API accetta e restituisce.
Un'API è un insieme di URL (endpoint) che altro software può chiamare per scambiare dati.
Ad esempio, un client potrebbe richiedere dati meteo con GET /weather?city=Berlin e il server risponde con JSON strutturato. Il client non ha bisogno di accesso diretto al database: usa la risposta dell'API.
Il routing mappa un metodo HTTP + path a una funzione Python.
In FastAPI si usano tipicamente i decorator:
@app.get("/items") per operazioni di lettura@app.post("/items") per creare risorse@app.put("/items/{id}") per aggiornare/sostituireI path parameter fanno parte della struttura dell'URL e di solito identificano una risorsa specifica (obbligatori).
GET /users/42 → 42 è un path parameterI query parameter sono aggiunti dopo ? e sono solitamente filtri opzionali.
I modelli Pydantic definiscono la forma e le regole dei tuoi dati (tipi, campi obbligatori, vincoli). FastAPI li usa per:
Se la validazione fallisce, FastAPI normalmente risponde con 422 Unprocessable Entity e dettagli su quale campo è errato.
FastAPI genera automaticamente uno schema OpenAPI dalle tue route, dai type hint e dai modelli.
Ottieni di solito documentazione interattiva gratuitamente:
/docs/redocPoiché lo schema deriva dal codice, la documentazione rimane sincronizzata quando cambi parametri o modelli.
Usa async def quando il tuo endpoint passa molto tempo in attesa di I/O (chiamate al database, richieste HTTP esterne, accesso a storage).
Usa def regolare quando:
È comune mescolare endpoint sync e async nella stessa app.
Le dependency sono blocchi riutilizzabili che FastAPI inietta negli endpoint tramite Depends().
Sono usate comunemente per:
Riduce la ripetizione e centralizza la logica trasversale, così le modifiche si fanno in un solo punto.
FastAPI non protegge automaticamente l'API: scegli uno schema e integralo negli endpoint. Schemi comuni:
Ricorda anche le basi:
Per i test, puoi usare TestClient di FastAPI/Starlette per chiamare l'API in-process (senza server).
Cose pratiche da verificare:
Per il deploy, esegui un server ASGI (es. Uvicorn), aggiungi logging, health check (es. ), timeout e configurazione basata sull'ambiente.
@app.delete("/items/{id}") per rimuovereQuesto rende l'API facilmente leggibile direttamente dal codice.
GET /users?limit=10&active=true → limit, active sono query parameter/health