FastAPI Cheatsheet

Path Operations

Use this FastAPI reference while you build software engineering projects, review code for technical interview prep, or polish examples for a software engineer resume.

HTTP Method Decorators

from fastapi import FastAPI

app = FastAPI()

@app.get("/items")
def get_items(): ...

@app.post("/items")
def create_item(): ...

@app.put("/items/{id}")
def replace_item(id: int): ...

@app.patch("/items/{id}")
def update_item(id: int): ...

@app.delete("/items/{id}")
def delete_item(id: int): ...

@app.head("/items")
def head_items(): ...

@app.options("/items")
def options_items(): ...

Decorator Parameters

@app.get(
    "/items/{id}",
    summary="Get a single item",           # shows in docs
    description="Longer description here", # Markdown supported
    response_description="The item",       # docs label for 200 response
    tags=["items"],                        # grouping in Swagger UI
    status_code=200,                       # default response code
    response_model=ItemOut,                # shape the response
    response_model_exclude_unset=True,     # omit fields not explicitly set
    response_model_exclude_none=True,      # omit None fields
    response_model_include={"id", "name"},
    response_model_exclude={"password"},
    deprecated=True,                       # mark in docs
    include_in_schema=False,               # hide from OpenAPI entirely
    operation_id="getItem",               # custom OpenAPI operationId
    responses={
        404: {"description": "Not found"},
        422: {"description": "Validation error"},
    },
)
def get_item(id: int): ...

Path Parameters

@app.get("/users/{user_id}/posts/{post_id}")
def get_post(user_id: int, post_id: int):
    return {"user": user_id, "post": post_id}

Path parameter names must match the {name} in the path string.

Response Model

from pydantic import BaseModel

class ItemIn(BaseModel):
    name: str
    price: float
    secret: str

class ItemOut(BaseModel):
    name: str
    price: float
    # secret is NOT here — filtered automatically

@app.post("/items", response_model=ItemOut)
def create_item(item: ItemIn):
    return item  # FastAPI filters to ItemOut shape

Return Types (Python 3.10+)

# Use return type annotation instead of response_model:
@app.get("/items/{id}")
def get_item(id: int) -> ItemOut:
    ...

Multiple Response Models / Union

from typing import Union

@app.get("/things/{id}", response_model=Union[Cat, Dog])
def get_thing(id: int): ...

List Responses

from typing import List

@app.get("/items", response_model=List[ItemOut])
def list_items() -> list[ItemOut]:
    return db.query_all()

Route Order Matters

# CORRECT — fixed path before parameterized:
@app.get("/users/me")
def get_me(): ...

@app.get("/users/{user_id}")
def get_user(user_id: int): ...

# WRONG — /users/me would be swallowed by {user_id} above it

APIRouter: Grouping Routes

from fastapi import APIRouter

router = APIRouter(
    prefix="/items",
    tags=["items"],
    responses={404: {"description": "Not found"}},
)

@router.get("/")
def list_items(): ...

@router.get("/{id}")
def get_item(id: int): ...

# main.py
app.include_router(router)

Returning Raw Responses

from fastapi.responses import (
    JSONResponse, HTMLResponse, PlainTextResponse,
    RedirectResponse, StreamingResponse, FileResponse,
    Response,
)

@app.get("/redirect")
def redirect():
    return RedirectResponse(url="/new-url", status_code=302)

@app.get("/html", response_class=HTMLResponse)
def html_page():
    return "<h1>Hello</h1>"

@app.get("/file")
def download():
    return FileResponse("report.pdf", filename="report.pdf")

@app.get("/stream")
def stream():
    def gen():
        for i in range(10):
            yield f"chunk {i}\n"
    return StreamingResponse(gen(), media_type="text/plain")

Path Operation Tags and Metadata

# Tag multiple routers at the app level:
app = FastAPI(
    openapi_tags=[
        {"name": "users", "description": "Operations with users."},
        {"name": "items", "description": "Item management."},
    ]
)

Documenting with Docstrings

@app.get("/items/{id}")
def get_item(id: int):
    """
    Retrieve a single item by its **ID**.

    - **id**: the unique integer identifier
    """
    ...

FastAPI renders the docstring as the route's description in Swagger UI (Markdown supported).