Introduction to FastAPI¶
What is an API?¶
An API (Application Programming Interface) is a way for two programs to talk to each other.
When you open Swiggy and search for "pizza":
- Your phone (the client) sends a request: "Show me pizza near me."
- A backend server runs that request: searches the database, finds restaurants.
- The server sends back the results.
The thing in the middle that defines the rules for this conversation is an API.
API endpoint = a URL the client can hit to ask for something.
Example: https://api.example.com/restaurants?cuisine=pizza
What is FastAPI?¶
FastAPI is a Python framework for building APIs. It lets you write a Python function and expose it as a web endpoint.
# main.py — a complete FastAPI app
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def home():
return {"message": "Hello, World!"}
Run it (we'll cover this in detail next chapter):
Open http://127.0.0.1:8000 — you'll see {"message": "Hello, World!"}.
Why FastAPI?¶
Compared to older frameworks (Flask, Django REST):
| Feature | FastAPI | Flask | Django REST |
|---|---|---|---|
| Speed | Very fast | Medium | Slower |
| Async support | Built-in | Bolt-on | Bolt-on |
| Auto-generates docs | Yes (Swagger + ReDoc) | No | No |
| Validates input automatically | Yes (via Pydantic) | Manual | Manual (serializers) |
| Type-hint driven | Yes | No | No |
| Learning curve | Easy | Easy | Medium |
The big three reasons people pick FastAPI:
- Auto-generated interactive docs — go to
/docsand try every endpoint live in your browser. - Type hints power everything — write
def get_user(user_id: int)and FastAPI validates, parses, and documents that automatically. - Async-native — handles thousands of concurrent requests on a single process.
How FastAPI works — the request lifecycle¶
When a request comes in, here's what happens:
1. Client sends HTTP request to your server
↓
2. uvicorn (the web server) receives the bytes
↓
3. uvicorn passes the request to FastAPI
↓
4. FastAPI looks at the URL & matches it to a route
↓
5. FastAPI reads type hints — parses query/path/body
↓
6. FastAPI runs validation (via Pydantic)
↓
7. Your function is called with parsed args
↓
8. Whatever you return is converted to JSON
↓
9. FastAPI builds the HTTP response
↓
10. uvicorn sends it back to the client
So you only write step 7 — the function. FastAPI + uvicorn handle 1-6 and 8-10 automatically.
Sync vs async — what's the difference?¶
Synchronous (Flask-style): one request at a time per worker. Slow request blocks others.
Asynchronous (FastAPI default): one worker can handle many requests concurrently. While one is waiting for the database, the worker handles another.
Sync:
Request 1 ──[5s DB query]──> Response 1
Request 2 ──────waiting──────[5s DB query]──> Response 2 (10s total!)
Async:
Request 1 ──[5s DB query──────]──> Response 1
Request 2 ──[5s DB query──]──> Response 2 (5s total, mostly!)
That's why FastAPI is dramatically faster for I/O-heavy APIs.
What you'll learn in this tutorial¶
| # | Chapter |
|---|---|
| 2 | Install + first app + uvicorn |
| 3 | Path and query parameters |
| 4 | Request body & Pydantic models |
| 5 | Response models, status codes |
| 6 | Error handling with HTTPException |
| 7 | A complete CRUD example — patient records |
| 8 | Pydantic deep dive — validators, fields |
| 9 | Async/await — when and how |
| 10 | Dependency injection |
| 11 | Middleware & CORS |
| 12 | Authentication — OAuth2 + JWT |
| 13 | Deploy an ML model with FastAPI |
| 14 | Docker + cloud deployment |
Prerequisites¶
- Basic Python — variables, functions, classes, dictionaries.
- Ability to install Python packages with
pip. - A code editor (VS Code recommended).
- A terminal.
What's next¶
Practice¶
What does this print?
Expected: True
Use FastAPI (not Flask) when you want auto-generated OpenAPI docs
Expected: True
Quiz — Quick check¶
What you remember
Q1. What is FastAPI built on top of?
- Starlette (ASGI framework) + Pydantic (data validation)
- Django
- Flask
- Express.js
Why: Starlette provides the async web primitives; Pydantic handles type-driven validation. FastAPI combines them with OpenAPI auto-generation.
Q2. What's the killer feature over Flask?
- Type hints automatically produce request validation AND OpenAPI/Swagger docs
- Faster execution
- Built-in ORM
- No async needed
Why: Annotate args with types → FastAPI validates incoming data against them, returns 422 on mismatch, and generates Swagger UI at
/docs. Zero schema definition boilerplate.
Q3. Recommended install for development?
-
pip install "fastapi[standard]"(bundles uvicorn and useful extras) -
pip install fastapi-server -
apt install fastapi - No install needed
Why: The
[standard]extras give you uvicorn, a CLI, and common middlewares. For minimal production deps, installfastapianduvicorn[standard]separately.
Common doubts¶
Is FastAPI production-ready?
Yes — used at scale by Microsoft, Uber, Netflix and many startups. Performance is on par with Node.js/Go for I/O-bound APIs. Excellent docs, active maintenance, large community.
FastAPI or Django for a new project?
FastAPI for APIs, microservices, async-heavy work. Django for full-stack apps with HTML rendering, admin panels, ORM-heavy CRUD. Many teams use both: Django for the monolith, FastAPI for ML/microservices.
Can I serve a web frontend with FastAPI?
Possible (FileResponse, Jinja2), but not its strength. Better: deploy SPA frontend separately (Vercel/Netlify), have FastAPI serve only the API. Use CORS middleware to allow the SPA to call your API.