FastAPI - 现代 Web 框架
安装
pip install fastapi uvicorn
快速开始
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Hello!"}
# 启动: uvicorn main:app --reload
路由参数
@app.get("/items/{item_id}")
def get_item(item_id: int):
return {"item_id": item_id, "name": "item"}
# 查询参数
@app.get("/search")
def search(q: str, limit: int = 10):
return {"q": q, "limit": limit}
请求体 & 响应模型
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
is_available: bool = True
@app.post("/items/")
def create_item(item: Item):
return item
@app.get("/items/{item_id}", response_model=Item)
def get_item(item_id: int):
return Item(name="Test", price=10.0)
依赖注入
from fastapi import Depends
def get_db():
db = connect_db()
try:
yield db
finally:
db.close()
@app.get("/users/")
def get_users(db = Depends(get_db)):
return db.query(User).all()
# 带类型的路径参数
@app.get("/users/{user_id}")
def read_user(user_id: int):
return {"user_id": user_id, "is_valid": user_id > 0}
查询参数
from fastapi import FastAPI
from typing import Optional
app = FastAPI()
@app.get("/items/")
def read_items(skip: int = 0, limit: int = 10):
return {"skip": skip, "limit": limit}
# 可选查询参数
@app.get("/search/")
def search(q: Optional[str] = None):
return {"query": q}
请求体
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str
price: float
tax: Optional[float] = None
@app.post("/items/")
def create_item(item: Item):
return {"item": item, "total_price": item.price + (item.tax or 0)}
响应模型
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class UserIn(BaseModel):
username: str
password: str
class UserOut(BaseModel):
username: str
email: str
@app.post("/users/", response_model=UserOut)
def create_user(user: UserIn):
# 创建用户逻辑
return {"username": user.username, "email": f"{user.username}@example.com"}
表单数据
from fastapi import FastAPI, Form
app = FastAPI()
@app.post("/login/")
def login(username: str = Form(...), password: str = Form(...)):
return {"username": username}
文件上传
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...)):
contents = await file.read()
return {
"filename": file.filename,
"content_type": file.content_type,
"size": len(contents)
}
Cookie 和 Header
from fastapi import FastAPI, Cookie, Header
app = FastAPI()
@app.get("/items/")
def read_items(
ads_id: str = Cookie(None),
user_agent: str = Header(None)
):
return {"ads_id": ads_id, "User-Agent": user_agent}
响应状态码
from fastapi import FastAPI, status
app = FastAPI()
@app.post("/items/", status_code=status.HTTP_201_CREATED)
def create_item(name: str):
return {"name": name}
@app.get("/items/{item_id}", status_code=status.HTTP_200_OK)
def read_item(item_id: int):
return {"item_id": item_id}
异常处理
from fastapi import FastAPI, HTTPException
app = FastAPI()
items = {"foo": "The Foo Wrestlers"}
@app.get("/items/{item_id}")
def read_item(item_id: str):
if item_id not in items:
raise HTTPException(
status_code=404,
detail="Item not found"
)
return {"item": items[item_id]}
💡 提示:FastAPI 是构建现代 API 的最佳选择之一,特别适合微服务架构。