用Python写接口服务,过去大家习惯拿Flask或Django加插件凑一套RESTful出来。FastAPI出现后,情况变了:它天生支持异步,靠类型标注就能把参数校验、文档生成全包办。下面直接看怎么从零搭一个能跑的接口。

一、环境准备与最小应用
FastAPI依赖ASGI服务器才能运行,官方推荐用uvicorn。先建个虚拟环境把包装好,避免污染全局Python。
python -m venv venv source venv/bin/activate pip install fastapi uvicorn
装完之后,写一个最小例子。注意这里没有用任何装饰器去声明参数类型,仅用函数返回字典,FastAPI就会把它转成JSON响应。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"msg": "hello"}
启动命令是uvicorn main:app --reload,其中main是文件名,app是实例名。浏览器打开根路径就能看到JSON。这种写法比Flask还短,但背后已经走了完整的ASGI生命周期。
二、路径参数与查询参数
FastAPI通过函数签名区分路径参数和查询参数。路径参数写在大括号里,函数形参标注类型;查询参数直接写形参即可,框架会自动从URL问号后解析。
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
上面代码中,item_id被标成int,如果有人传字符串,FastAPI直接返回422错误,不用你手写判断。q是可选查询参数,不传就是None。这种强制类型声明让接口更稳,也省了校验代码。
对比Flask要用request.args.get再转换,FastAPI在入口就完成了转换和校验。如果参数多,还可以用Pydantic模型收口,后面会讲。
三、用Pydantic做请求体校验
当接口需要接收JSON body时,定义一个Pydantic模型,FastAPI会自动解析并校验字段类型,缺字段也会报422。
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
is_offer: bool = False
app = FastAPI()
@app.post("/items/")
def create_item(item: Item):
return {"name": item.name, "price": item.price}
这里Item继承BaseModel,字段带默认值。客户端发来的JSON若price写成字符串,框架直接拒绝。你拿到的item对象已是Python类型,不用自己json.loads再加try。
这种做法把数据契约显式写出来,前端对照模型就知道该传什么。文档里也会列出字段说明,减少沟通成本。
四、依赖注入分离公共逻辑
接口常要鉴权或读配置。FastAPI用依赖注入把这部分抽出来,不污染业务函数。
from fastapi import FastAPI, Depends, HTTPException
app = FastAPI()
def check_token(token: str = None):
if token != "secret":
raise HTTPException(status_code=401, detail="bad token")
return token
@app.get("/secure/")
def secure_data(token: str = Depends(check_token)):
return {"data": "ok"}
check_token是个普通函数,框架在调secure_data前先跑它。失败就抛异常,成功把返回值注入形参。这样多个接口复用同一逻辑时,只写一次。
依赖还能嵌套,比如先查用户再查权限。比起中间件,它更细粒度,只作用于声明了的接口。
五、自带文档与调试
启动后访问 /docs 就是Swagger UI,能直接发请求看响应。访问 /redoc 是另一种文档样式。这两者都是根据类型标注和模型自动生成的。
| 路径 | 用途 |
|---|---|
| /docs | 交互式Swagger调试页 |
| /redoc | 静态文档页 |
| /openapi.json | 原始OpenAPI描述 |
不用装Postman也能测接口。前端同事看/docs就知道参数格式,后端改模型文档实时变。
总体看,FastAPI把Python类型系统变成了接口定义语言。写少了校验代码,跑起来是异步性能,文档还自动有。新手从上面几段例子起步,半天就能交付一个合规的API服务。
FastAPIPython_APIASGI修改时间:2026-08-04 03:42:26