FastAPI#
#
Install & Run#
~$ pip install fastapi uvicorn
~$ uvicorn main:app --reload
Hello World#
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Hello FastAPI"}
CLI Run Hint#
uvicorn main:app --reload
Routing & Parameters#
Path Parameter#
@app.get("/items/{id}")
def read(id: int):
return {"id": id}
Query Parameter#
@app.get("/search")
def find(q: str = "default"):
return {"q": q}
Optional Query#
@app.get("/filter")
def filter_data(limit: int = 10, active: bool = True):
return {"limit": limit, "active": active}
Request Body & Validation#
Using Pydantic#
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
JSON Body#
@app.post("/items/")
def create(item: Item):
return item
Response Model#
@app.post("/items/", response_model=Item)
def create(item: Item):
return item
Forms, Files, Headers#
Form Input#
from fastapi import Form
@app.post("/login")
def login(user: str = Form(...)):
return {"user": user}
File Upload#
from fastapi import UploadFile, File
@app.post("/upload")
def upload(f: UploadFile = File(...)):
return {"filename": f.filename}
Middleware & Dependency#
Middleware#
@app.middleware("http")
async def log_req(req, call_next):
res = await call_next(req)
return res
Dependency#
from fastapi import Depends
def auth(token: str = ""):
if token != "xyz": raise HTTPException(401)
return True
@app.get("/secure")
def secure(_: bool = Depends(auth)):
return {"secure": True}
Errors & JSON API#
HTTP Error#
from fastapi import HTTPException
@app.get("/err")
def error():
raise HTTPException(404, "Not Found")
JSON API#
from fastapi import FastAPI
@app.get("/json")
def get_data():
return {"status": "ok"}
Templates & Static#
Mount Static#
from fastapi.staticfiles import StaticFiles
app.mount("/static", StaticFiles(directory="static"), name="static")
Jinja2 Support#
from fastapi.templating import Jinja2Templates
templates = Jinja2Templates("templates")
Routers & Structure#
Routers (Blueprints)#
from fastapi import APIRouter
router = APIRouter()
@router.get("/")
def admin():
return {"admin": True}
app.include_router(router, prefix="/admin")
Folder Layout#
project/
├── main.py
├── static/
├── templates/
├── routers/
│ └── admin.py
└── models/
Docs & Status#
Built-in Docs#
Swagger:
/docsReDoc:
/redoc
Custom Status Code#
from fastapi import status
@app.post("/create", status_code=status.HTTP_201_CREATED)
def create():
return {"msg": "Created"}