r3f.cn
GitHub Repo stars

FastAPI

一个 FastAPI 的简明速查表,FastAPI 是一个用于构建 API 的快速、现代的 Web 框架,使用 Python 3.7+。

#快速入门

#安装与运行

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 运行提示

uvicorn main:app --reload

#路由与参数

#路径参数

@app.get("/items/{id}")
def read(id: int):
        return {"id": id}

#查询参数

@app.get("/search")
def find(q: str = "default"):
        return {"q": q}

#可选查询参数

@app.get("/filter")
def filter_data(limit: int = 10, active: bool = True):
        return {"limit": limit, "active": active}

#请求体与验证

#使用 Pydantic

from pydantic import BaseModel

class Item(BaseModel):
        name: str
        price: float

#JSON 请求体

@app.post("/items/")
def create(item: Item):
        return item

#响应模型

@app.post("/items/", response_model=Item)
def create(item: Item):
        return item

#表单、文件、请求头

#表单输入

from fastapi import Form

@app.post("/login")
def login(user: str = Form(...)):
        return {"user": user}

#文件上传

from fastapi import UploadFile, File

@app.post("/upload")
def upload(f: UploadFile = File(...)):
        return {"filename": f.filename}

#请求头 / Cookies

from fastapi import Header, Cookie

@app.get("/info")
def info(ua: str = Header(None)):
        return {"UA": ua}

#中间件与依赖注入

#中间件

@app.middleware("http")
async def log_req(req, call_next):
        res = await call_next(req)
        return res

#依赖注入

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}

#错误处理与 JSON API

#HTTP 错误

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"}

#模板与静态文件

#挂载静态文件

from fastapi.staticfiles import StaticFiles
app.mount("/static", StaticFiles(directory="static"), name="static")

#Jinja2 支持

from fastapi.templating import Jinja2Templates
templates = Jinja2Templates("templates")

#路由与项目结构

#路由 (蓝图)

from fastapi import APIRouter
router = APIRouter()

@router.get("/")
def admin():
        return {"admin": True}

app.include_router(router, prefix="/admin")

#文件夹布局

project/
├── main.py
├── static/
├── templates/
├── routers/
│   └── admin.py
└── models/

#文档与状态码

#内置文档

  • Swagger: /docs
  • ReDoc: /redoc

#自定义状态码

from fastapi import status

@app.post("/create", status_code=status.HTTP_201_CREATED)
def create():
        return {"msg": "Created"}