Path Parameters
Define path parameters with type hints:
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/{user_id}")
def get_user(user_id: int):
return {"user_id": user_id}
@app.get("/items/{item_id}/{category}")
def get_item(item_id: int, category: str):
return {"item_id": item_id, "category": category}
Query Parameters
Handle query parameters:
from typing import Optional
@app.get("/items/")
def read_items(
skip: int = 0,
limit: int = 10,
q: Optional[str] = None
):
return {
"skip": skip,
"limit": limit,
"q": q
}
# URL: /items/?skip=0&limit=20&q=search
Request Body
Handle POST requests:
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
description: Optional[str] = None
@app.post("/items/")
def create_item(item: Item):
return item
HTTP Methods
Support different HTTP methods:
@app.get("/items/{item_id}") # GET
@app.post("/items/") # POST
@app.put("/items/{item_id}") # PUT
@app.delete("/items/{item_id}") # DELETE
@app.patch("/items/{item_id}") # PATCH
Response Models
Define response structure:
class UserResponse(BaseModel):
id: int
name: str
email: str
@app.get("/users/{user_id}", response_model=UserResponse)
def get_user(user_id: int):
return UserResponse(id=user_id, name="Alice", email="[email protected]")
Status Codes
Set custom status codes:
from fastapi import status
@app.post("/items/", status_code=status.HTTP_201_CREATED)
def create_item(item: Item):
return item
Best Practices
- Use type hints: Enable automatic validation
- Use Pydantic models: For request/response validation
- Organize with routers: For large applications
- Document endpoints: FastAPI auto-generates docs
Next Steps
Learn about Pydantic models for data validation, or explore dependencies.