FastAPI is een modern Python‑framework om API's snel te bouwen, met type hints, validatie en automatische OpenAPI‑docs. Leer de basis en gebruikstoepassingen.

FastAPI is een Python-framework om web‑API's snel te bouwen, met duidelijke code en automatische documentatie. Je schrijft kleine functies (zogeheten “endpoints”) die aangeven welke data je API accepteert en wat hij teruggeeft, en FastAPI regelt de webplumbing—routing, validatie en het teruggeven van JSON-responses.
Een API is een set URL's waarmee het ene softwaredeel met het andere kan praten.
Bijvoorbeeld: een weer-app op je telefoon kan een URL aanroepen zoals GET /weather?city=Berlin. De server antwoordt met gestructureerde data (meestal JSON), zoals temperatuur en verwachting. De telefoon heeft geen directe toegang tot de database van de server—hij vraagt gewoon de API en toont het resultaat.
FastAPI helpt je die URL's en responses in Python te maken.
Je hoeft geen async‑expert te zijn om te beginnen; schrijf simpele endpoints en neem meer geavanceerde patronen over naarmate je groeit.
FastAPI werd snel populair omdat het veel van de dagelijkse frictie wegneemt die je tegenkomt bij het bouwen van API's in Python.
Traditionele API‑projecten beginnen vaak met trage setup en veel 'plumbing':
De kernfeatures van FastAPI richten zich op deze problemen, zodat teams meer tijd besteden aan het ontwerpen van endpoints en minder tijd aan framework‑boilerplate.
FastAPI leunt zwaar op Python type hints. Als je aangeeft dat een veld een int is, optioneel of een lijst van iets, gebruikt FastAPI die informatie om inputs te valideren en outputs te vormen.
Dit vermindert fouten door 'stringly‑typed' code (bijv. ergens een ID als tekst behandelen en elders als getal) en moedigt consistente endpoint‑gedragingen aan. Het is nog steeds Python, maar met duidelijkere verwachtingen in functie‑handtekeningen.
Omdat het API‑schema uit de code wordt afgeleid, kan FastAPI interactieve documentatie automatisch genereren (OpenAPI + Swagger UI/ReDoc). Dat is handig voor samenwerking: frontend‑ontwikkelaars, QA en integrators kunnen endpoints verkennen, requests proberen en exacte modellen zien zonder op aparte documentatie te wachten.
FastAPI lost geen slecht ontworpen API op. Je hebt nog steeds goede naamgeving, versiebeheer, foutafhandeling en security‑beslissingen nodig. Wat het wel biedt is een schoner pad van “idee” naar “duidelijk gedefinieerde API” met minder verrassingen.
FastAPI voelt eenvoudig zodra je een paar kernideeën begrijpt. Je hoeft geen interne details te onthouden—herken vooral de onderdelen die je dagelijks gebruikt.
Een framework is een set tools en conventies om een API te bouwen zonder vanaf nul te beginnen. FastAPI levert de ‘plumbing’ voor gebruikelijke API‑taken: endpoints definiëren, input lezen, output teruggeven, fouten afhandelen en code organiseren tot een onderhoudbare structuur.
Routing map een URL en HTTP‑methode naar een stukje Python‑code.
Bijvoorbeeld route je GET /users naar “lijst gebruikers” en POST /users naar “maak een gebruiker aan.” In FastAPI definieer je routes vaak met decorators zoals @app.get(...) en @app.post(...), waardoor het makkelijk is om in één oogopslag te zien wat je API aanbiedt.
Elke API‑aanroep is een request (wat de client stuurt) en een response (wat de server terugstuurt).
FastAPI helpt je:
/users/{id}), de querystring (?page=2), headers en de request body200, 201, 404)FastAPI draait op ASGI, een moderne standaard voor Python‑webservers. In de praktijk betekent dit dat FastAPI is ontworpen om veel verbindingen efficiënt af te handelen en functies zoals long‑lived connections (bijv. WebSockets) te ondersteunen—zonder dat jij laag‑niveau netwerkbeheer hoeft te doen.
Python type hints (zoals str, int, list[Item]) zijn in FastAPI geen alleen een documentatiehulp—ze zijn een kerninvoer. FastAPI gebruikt ze om te begrijpen welke data je verwacht, binnenkomende waarden naar de juiste types om te zetten en duidelijkere, voorspelbare APIs te produceren.
Pydantic‑modellen laten je de vorm van data (velden, types, optionele waarden) op één plek definiëren. FastAPI gebruikt deze modellen om inkomende JSON te valideren, ongeldige input af te wijzen met bruikbare foutmeldingen en output consistent te serialiseren—zodat je API betrouwbaar blijft, zelfs bij rommelige client‑data.
FastAPI‑apps zijn opgebouwd rond endpoints: een URL‑pad plus een HTTP‑methode. Zie een endpoint als “wat de client vraagt” en “hoe hij het vraagt.” Bijvoorbeeld kan een client GET /users doen om gebruikers te tonen, of POST /users om er een aan te maken.
Een pad is de route en de methode is de actie:
GET /products → gegevens ophalenPOST /products → gegevens versturen om iets te makenPUT /products/123 → iets vervangen/bijwerkenDELETE /products/123 → iets verwijderenFastAPI scheidt data die deel is van het pad van data die optionele “filters” op de request zijn.
GET /users/42 → 42 is het gebruikers‑ID.? en meestal optioneel.
GET /users?limit=10&active=true → limit en active bepalen hoe resultaten worden teruggegeven.Als een client gestructureerde data (meestal JSON) stuurt, zit die in de request body, vaak met POST of PUT.
Voorbeeld: POST /orders met JSON zoals { "item_id": 3, "quantity": 2 }.
FastAPI kan gewone Python‑objecten (zoals dicts) teruggeven, maar het valt op wanneer je een response model definieert. Dat model werkt als een contract: velden krijgen een vaste vorm, extra data kan worden gefilterd en types worden afgedwongen. Het resultaat is schonere APIs—clients weten wat ze kunnen verwachten en je voorkomt verrassende responses die integraties breken.
“Async” (kort voor asynchronous) is een manier waarop je API veel verzoeken efficiënt kan afhandelen wanneer veel tijd wordt besteed aan wachten.
Stel je een barista voor die bestellingen opneemt. Als hij stil moet staan en niks kan doen terwijl het espressomachine loopt, bedient hij minder klanten. Een betere aanpak is: zet de koffie in gang en neem ondertussen de volgende bestelling op.
Async werkt zo. Je FastAPI‑app kan een operatie starten die op iets langzaam wacht—zoals een netwerkrequest of een databasequery—en terwijl hij wacht, doorgaan met andere binnenkomende requests.
Async is nuttig wanneer je API veel I/O‑werk doet—werk dat veel tijd wacht in plaats van rekentijd. Veelvoorkomende voorbeelden:
Als je endpoints vaak wachten op zulke operaties, kan async de throughput verbeteren en verminderen dat requests zich ophopen bij belasting.
Async is geen universele sneltoets. Als je endpoint vooral CPU‑intensief is—zoals grote afbeeldingen aanpassen, datawetenschappelijke berekeningen of zware encryptie—dan maakt async die berekeningen niet sneller. In zulke gevallen heb je andere strategieën nodig (background workers, process pools of horizontaal schalen).
Je hoeft niet alles te herschrijven om FastAPI te gebruiken. Je kunt gewone (sync) routefuncties schrijven en FastAPI draait ze prima. Veel projecten mixen beide stijlen: houd simpele endpoints synchroon en gebruik async def waar het duidelijk helpt (meestal rond databasecalls of externe HTTP‑requests).
Validatie is de controlepost tussen de buitenwereld en je code. Als een API input accepteert (JSON body, query params, padparams), wil je zeker weten dat die compleet is, het juiste type heeft en binnen redelijke grenzen valt—voordat je naar een database schrijft, een andere service aanroept of businesslogica uitvoert.
FastAPI vertrouwt op Pydantic‑modellen hiervoor. Je beschrijft wat “goede data” is op één plek, en FastAPI doet automatisch:
Als een client de verkeerde datastructuur stuurt, reageert FastAPI met 422 Unprocessable Entity en een gestructureerde foutpayload die naar het exacte veld en de reden wijst. Dat maakt het voor client‑ontwikkelaars makkelijker om requests snel te herstellen.
Hier is een klein model dat verplichte velden, types, min/max‑restricties en formats laat zien:
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 moet aanwezig zijn.age moet een integer zijn.age is beperkt tot 13–120.EmailStr dwingt een geldig e‑mailformaat af.Dezelfde modellen kunnen output vormen, zodat je API‑responses niet per ongeluk interne velden lekken. Je retourneert Python‑objecten; FastAPI (via Pydantic) zet ze om naar JSON met de juiste veldnamen en types.
Een van FastAPI’s meest praktische features is dat het API‑documentatie automatisch voor je genereert—op basis van de code die je al schreef.
OpenAPI is een standaard om een API gestructureerd te beschrijven (meestal JSON). Zie het als een “contract” dat uitlegt:
GET /users/{id})Omdat het machineleesbaar is, kunnen tools het gebruiken om testclients te genereren, requests te valideren en teams op één lijn te houden.
FastAPI levert twee gebruiksvriendelijke docs‑pagina’s automatisch:
In een typische FastAPI‑project vind je ze op:
/docs (Swagger UI)/redoc (ReDoc)Als je padparameters, request‑ of response‑modellen of validatieregels wijzigt, werkt het OpenAPI‑schema (en de docs‑pagina's) zich automatisch bij. Geen aparte stap voor 'docs onderhoud'.
Een FastAPI‑app kan klein zijn en toch echt aanvoelen. Je definieert een Python‑object app, voegt een paar routes toe en start een lokale server om het in je browser te proberen.
Hier is het kleinste nuttige voorbeeld:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI"}
Dat is alles: één route (GET /) die JSON teruggeeft.
Om het meer als een API te laten voelen, slaan we items in een lijst op. Dit is geen database—data wordt gereset bij server‑restart—maar perfect om te leren.
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
Je kunt nu:
POST /items?name=Coffee om een item toe te voegenGET /items om de lijst op te halenEen gebruikelijke starterstructuur is:
main.py (maakt app en routes aan)requirements.txt of pyproject.toml (dependencies)Meestal:
uvicorn main:app --reload)http://127.0.0.1:8000 en probeer de endpointsFastAPI “dependencies” zijn gedeelde inputs die je endpoints nodig hebben—zoals een database‑sessie, de huidige ingelogde gebruiker, app‑instellingen of veelgebruikte queryparameters. In plaats van die in elke route handmatig aan te maken of te parsen, definieer je ze één keer en laat je FastAPI ze beschikbaar maken waar nodig.
Een dependency is meestal een functie (of klasse) die een waarde teruggeeft die je endpoint kan gebruiken. FastAPI roept die voor je aan, bepaalt wat hij nodig heeft (op basis van zijn parameters) en injecteert het resultaat in je path‑operation‑functie.
Dit wordt vaak dependency injection genoemd, maar je kunt het ook zien als: “geef aan wat je nodig hebt en FastAPI koppelt het voor je.”
Zonder dependencies zou je bijvoorbeeld:
Met dependencies centraliseer je die logica. Als je later verandert hoe je een DB‑sessie maakt of hoe je de huidige gebruiker laadt, pas je één plek aan—niet tientallen endpoints.
page/limit parsing en validatie.Hier zie je het conceptuele patroon dat je in veel FastAPI‑apps ziet:
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"]}
Je declareert de dependency met Depends(...) en FastAPI geeft het resultaat door aan je endpointparameter. Dezelfde aanpak werkt voor complexere bouwstenen (zoals get_db() of get_current_user()), waardoor je code schoner blijft naarmate je API groeit.
FastAPI “beveiligt” je API niet automatisch—je kiest een schema en koppel het aan je endpoints. Het goede nieuws is dat FastAPI bouwstenen (vooral via het dependency‑systeem) biedt die veel voorkomende securitypatronen eenvoudiger maken om te implementeren.
Authenticatie beantwoordt: “Wie ben je?” Autorisatie beantwoordt: “Wat mag je doen?”
Voorbeeld: een gebruiker kan geauthenticeerd zijn (geldige login/token) maar toch niet bevoegd om een admin‑route te gebruiken.
X-API-Key). Zorg voor rotatie en intrekking.FastAPI ondersteunt deze patronen via utilities zoals fastapi.security en documenteert ze helder in OpenAPI.
Als je wachtwoorden opslaat, sla ze nooit in platte tekst op. Gebruik een gezouten, trage hash (bijv. bcrypt/argon2 via een gerenommeerde bibliotheek). Denk ook aan rate limiting en account lockout‑beleid.
Security draait om details: tokenopslag, CORS‑instellingen, HTTPS, geheime beheer en correcte autorisatiechecks op elk gevoelig endpoint. Zie ingebouwde helpers als startpunt en valideer je aanpak met reviews en tests voordat je er in productie op vertrouwt.
Testen is waar de belofte van “werkt op mijn machine” verandert in het vertrouwen om te releasen. Het goede nieuws: FastAPI is gebouwd op Starlette, dus je krijgt sterke testingtools zonder veel setup.
Unit tests richten zich op kleine onderdelen: een functie die een waarde berekent, een dependency die de huidige gebruiker laadt, of een servicemethode die met de database praat (vaak gemockt).
Integratietests testen de API end‑to‑end: je roept een endpoint aan en controleert de volledige HTTP‑response. Deze tests vangen routingfouten, dependency‑koppelingen en validatieproblemen.
Een gezonde testset heeft meestal meer unit tests (snel) en minder integratietests (hogere betrouwbaarheid).
FastAPI‑apps kun je “als client” testen met Starlette’s TestClient, die requests in‑process stuurt—geen server nodig.
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
Test de zaken waar gebruikers en andere systemen van afhangen:
Gebruik voorspelbare data, isoleer externe diensten (mock of gebruik een test‑DB) en vermijd gedeelde staat tussen tests. Snelle tests worden uitgevoerd; trage tests worden vaak overgeslagen.
Je FastAPI‑app online krijgen draait vooral om het kiezen van de juiste “runner” en het toevoegen van een paar productie‑essentials.
Als je lokaal uvicorn main:app --reload draait, gebruik je een ontwikkelsetup: autoreload, uitgebreide foutmeldingen en instellingen die gemak prioriteren.
In productie draai je Uvicorn vaak zonder reload, eventueel achter een process manager (zoals Gunicorn met Uvicorn‑workers) of achter een reverse proxy. Het doel is stabiliteit: gecontroleerde restarts, voorspelbare performance en veiliger defaults.
Een gangbaar patroon is:
Dit maakt één codebase inzetbaar naar meerdere omgevingen zonder bestanden aan te passen.
Voordat je ‘klaar’ zegt, controleer of je hebt:
/health voor uptime‑monitoring en load balancers.Als je van “werkt lokaal” naar “shippable” gaat, helpt het ook om te standaardiseren hoe je het API‑contract genereert en beheert. Sommige teams combineren FastAPI’s OpenAPI‑output met geautomatiseerde workflows—bijv. clients genereren, requests valideren in CI en consistent deployen. Tools zoals Koder.ai kunnen ook in deze fase passen: je beschrijft de API in chat, iterereert endpoints en modellen snel en exporteert daarna broncode voor een normale review/deploy‑pipeline.
FastAPI is een goede keuze als je een nette, moderne manier zoekt om REST‑API's in Python te bouwen—vooral als je waarde hecht aan heldere request/response‑modellen en voorspelbaar gedrag naarmate je API groeit.
FastAPI blinkt uit in situaties zoals:
FastAPI is niet altijd het simpelste antwoord:
FastAPI kan in de praktijk erg snel zijn, maar snelheid hangt af van je databasecalls, netwerk‑latency en businesslogica. Verwacht degelijke throughput en lage latency voor typische API‑workloads—maar veronderstel niet dat het framework alleen trage I/O of inefficiënte queries oplost.
Als FastAPI geschikt lijkt, richt je dan eerst op routingpatronen, Pydantic‑modellen, databaseintegratie, background‑tasks en basisauthenticatie.
Een praktische aanpak is om een klein setje endpoints te bouwen en daarna uit te breiden met herbruikbare dependencies en tests. Als je de vroege scaffolding (routes, modellen en de eerste deployment‑klare structuur) wilt versnellen, overweeg dan een vibe‑coding workflow—bijv. je endpoints in een “planning mode” mappen en itereren vanuit één spec. Dat is een gebied waarin Koder.ai nuttig kan zijn: je prototypeert een API‑gedreven app vanuit chat, verfijnt de gegenereerde code en exporteert deze wanneer je klaar bent om het project als een standaardproject te runnen.
FastAPI is een Python-webframework voor het bouwen van API's met minimale boilerplate. Je schrijft endpointfuncties (zoals @app.get("/users")) en FastAPI regelt routing, request-parsing, validatie en JSON-responses.
Een belangrijk voordeel is dat je type hints en Pydantic-modellen fungeren als expliciet contract voor wat de API accepteert en retourneert.
Een API is een set URL's (endpoints) die andere software kan aanroepen om data uit te wisselen.
Bijvoorbeeld: een client kan weergegevens opvragen met GET /weather?city=Berlin, en de server reageert met gestructureerde JSON. De client heeft geen directe toegang tot de database—hij gebruikt alleen de API-respons.
Routing koppelt een HTTP-methode + pad aan een Python-functie.
In FastAPI gebruik je meestal decorators:
@app.get("/items") voor leesacties@app.post("/items") voor create-acties@app.put("/items/{id}") om te updaten/vervangenPadparameters maken deel uit van de URL-structuur en identificeren meestal een specifiek resource (verplicht).
GET /users/42 → 42 is een padparameterQueryparameters worden achter ? geplaatst en zijn meestal optionele filters of besturingselementen.
Pydantic-modellen definiëren de vorm en regels van je data (types, verplichte velden, constraints). FastAPI gebruikt ze om:
Als validatie faalt, reageert FastAPI meestal met 422 Unprocessable Entity en details over welk veld fout is.
FastAPI genereert automatisch een OpenAPI-schema uit je endpoints, type hints en modellen.
Meestal krijg je interactieve docs gratis:
/docs/redocOmdat het schema uit de code wordt afgeleid, blijven de docs synchroon wanneer je parameters en modellen wijzigt.
Gebruik async def wanneer je endpoint veel tijd wacht op I/O (databasecalls, externe HTTP-aanvragen, bestandsopslag).
Gebruik gewone def wanneer:
Het mixen van sync en async endpoints in één app is gebruikelijk.
Dependencies zijn herbruikbare ‘bouwstenen’ die FastAPI injecteert in endpoints via Depends().
Ze worden vaak gebruikt voor:
Dit vermindert herhaling en centraliseert cross-cutting logic, zodat je één plek aanpast in plaats van veel endpoints.
FastAPI beveiligt je API niet automatisch—je kiest zelf een schema en koppelt dat aan je endpoints.
Veelvoorkomende patronen zijn:
Onthoud ook de basics:
Voor tests kun je FastAPI/Starlette’s TestClient gebruiken om je API in-process aan te roepen (geen server nodig).
Praktische zaken om te controleren:
Voor deployment: draai een ASGI-server (vaak Uvicorn; soms achter Gunicorn of een reverse proxy) en voeg productiezaken toe zoals logging, health checks (bijv. ), time-outs en omgevingconfiguratie.
@app.delete("/items/{id}") om te verwijderenDit maakt het API-aanbod in de code direct goed overzichtelijk.
GET /users?limit=10&active=true → limit, active zijn queryparameters/health