上篇我们认识了FastAPI的基本面貌和它背后的"类型哲学"。这一篇我们不绕弯子,直接说它到底能干什么,有哪些实实在在的作用。
四、FastAPI的核心作用
作用1:自动生成交互式API文档
这是FastAPI最让人"上头"的功能之一。你只要按照规范写好路径函数和类型注解,启动服务后访问/docs或/redoc,就能得到一份漂亮、可在线调试的文档。
Swagger UI(/docs):带"Try it out"按钮,可以直接在网页里发送请求,看到响应结果。后端同学写完接口,直接甩这个链接给前端,前端自己测试字段和返回值,不用再Postman里手动敲一遍URL。
ReDoc(/redoc):更偏向阅读,排版清晰,适合作为正式API参考文档。
而且文档永远和代码同步------你改了代码里的参数类型、默认值、描述(description参数),文档自动更新。从此告别"文档已过期"的尴尬。
作用2:自动数据校验与错误反馈
基于Pydantic,FastAPI能对传入的数据做多层校验:
类型校验:要求int就不能传字符串(除非能自动转换,如"123"变123)
约束校验:通过Field可以加gt=0(大于0)、max_length=10等
自定义校验:用@validator装饰器写自己的校验逻辑
嵌套模型:模型里可以嵌套另一个模型,自动递归校验
出错时,它会返回一个结构化的JSON,指出哪个字段错了、为什么错。前端可以直接把这个信息展示给用户,不用你手动解析异常再重写错误消息。
{
"detail": [
{
"loc": ["body", "age"],
"msg": "ensure this value is greater than 0",
"type": "value_error.number.not_gt"
}
]
}
作用3:高性能异步支持
FastAPI底层用的是Starlette,一个全异步的Web框架。你可以在路径函数前加async def,里面用await调用异步数据库驱动(如asyncpg、databases)、异步HTTP客户端(httpx.AsyncClient)等。
@app.get("/slow")
async def slow_query():
data = await some_async_db.fetch_all("SELECT ...")
return data
如果不需要异步,用普通def函数也没问题,FastAPI会自动在线程池里运行,避免阻塞事件循环。
性能上,根据TechEmpower的测试,FastAPI在Python框架里仅次于Starlette和Uvicorn本身,比Flask快很多(因为Flask同步且开销大)。对于大多数业务场景,单台机器应付几千RPS不是问题。
作用4:依赖注入系统
依赖注入听起来高大上,其实就是一个"懒人工具箱"。你定义一个函数负责产生某个依赖(比如当前用户对象、数据库连接),然后在路径函数的参数里用Depends(xxx)声明要使用它。FastAPI会自动调用那个函数,把结果传给你。
典型用途:
权限校验:提取请求头里的Token,验证后返回用户信息
数据库会话:请求开始前获取session,请求结束后关闭
重复逻辑复用:分页参数、通用过滤条件等
而且依赖可以嵌套依赖,可以支持同步/异步,可以缓存作用域(请求内单例)。代码复用程度极高,路径函数变得非常薄,只关心核心业务逻辑。
async def get_current_user(token: str = Header(...)):
user = decode_token(token)
if not user:
raise HTTPException(status_code=401)
return user
@app.get("/users/me")
async def read_current_user(current_user: User = Depends(get_current_user)):
return current_user
作用5:安全与认证集成
FastAPI内置了一些安全工具,覆盖OAuth2、JWT、API Key等常见认证方式。比如OAuth2密码流:
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
# 校验用户名密码,生成token
return {"access_token": token, "token_type": "bearer"}
@app.get("/users/me")
async def read_users_me(token: str = Depends(oauth2_scheme)):
# 解析token,返回用户信息
...
这些安全组件都遵循OpenAPI的安全规范,自动在文档上添加"Authorize"按钮,方便测试。
作用6:WebSocket支持
除了HTTP,FastAPI也原生支持WebSocket(因为Starlette支持)。你可以写一个@app.websocket("/ws")端点,在里面处理连接、接收消息、发送消息。适合实时聊天、推送通知、直播弹幕等场景。
from fastapi import WebSocket
@app.websocket("/ws/{client_id}")
async def websocket_endpoint(websocket: WebSocket, client_id: int):
await websocket.accept()
while True:
data = await websocket.receive_text()
await websocket.send_text(f"Echo: {data}")
作用7:后台任务
有时候你希望在返回响应之后,再执行一些耗时但不影响用户体验的操作,比如发送邮件、更新缓存、记录日志。FastAPI提供了BackgroundTasks,非常轻量。
from fastapi import BackgroundTasks
def send_welcome_email(email: str):
# 模拟发邮件,耗时操作
pass
@app.post("/users")
def create_user(user: User, background_tasks: BackgroundTasks):
background_tasks.add_task(send_welcome_email, user.email)
return {"msg": "User created, email will be sent in background"}
注意:BackgroundTasks适合小任务,如果任务很重(比如几十秒的视频转码),建议用真正的消息队列(Celery、RQ等)。
作用8:中间件、CORS、静态文件等常规功能
既然基于Starlette,FastAPI自然继承了各种实用中间件:
CORS:fastapi.middleware.cors.CORSMiddleware,配置允许哪些域名跨域访问
静态文件:mount一个StaticFiles实例,托管前端静态资源
自定义中间件:可以写@app.middleware("http"),拦截每个请求做日志、鉴权、加响应头等
异常处理:用@app.exception_handler统一捕获自定义异常,返回特定格式的错误信息
作用9:生成客户端SDK
因为FastAPI生成的OpenAPI规范是标准的JSON,你可以把它交给第三方工具(如OpenAPI Generator、Swagger Codegen)自动生成JavaScript、TypeScript、Java、Go等语言的客户端代码。前端同学一键生成API调用代码,再也不用手写axios.get和类型定义了。这种前后端"契约测试"级别的效率提升,是很多团队升级FastAPI的核心动力之一。
五、FastAPI适合什么场景?有什么短板?
适合:
从头开始的新项目,尤其是以API为主的(前后端分离、小程序、移动App后端)
需要高并发IO的场景(大量外部API调用、数据库查询)
团队希望用Python但受够了Flask/Django的样板代码和文档问题
机器学习模型服务(FastAPI启动快、支持异步、自动文档,很适合把训练好的模型包装成API)
不太适合或需要谨慎使用:
需要服务端渲染HTML的传统网站(当然你硬要用Jinja2模板也能凑合,但不如Flask/Django方便)
需要强大ORM和Admin后台的CMS系统(Django的Admin是杀手锏)
团队对异步编程不熟悉,又没人能hold住(异步虽好,但写不好会有各种坑,比如混用同步数据库驱动阻塞事件循环)
依赖大量同步的第三方库(比如某些老的SDK不支持异步),那异步的优势就发挥不出来
六、总结:FastAPI给了Python开发者一个"体面"的API开发体验
回过头看,FastAPI没有创造什么全新的技术,它把Python类型提示、Pydantic、Starlette这三样东西捏在了一起,加上一套流畅的API设计,结果产生了化学反应。它让你写API的时候:
不用手动解析请求参数
不用手动校验数据类型
不用手动转换类型
不用手动写文档
不用纠结同步异步的切换
所有这些脏活累活,FastAPI替你在背后默默干了。你只需要专注于业务逻辑,用Python的普通函数就能写出生产级别的API。这大概就是它能在短短几年内成为Python社区最受瞩目的框架之一的原因。