本教程介绍了 FastAPI 的基本使用,包括接口定义、数据模型、数据校验、依赖注入、中间件及接口文档。通过示例代码,展示了如何快速构建高性能 API 服务,适用于入门学习和实际开发。
GitHub:https://github.com/fastapi/fastapi
Document:https://fastapi.tiangolo.com/
conda create -n fastapi-env python=3.10 conda activate fastapi-env pip install uvicorn fastapi requests python-multipart
1. 基本流程
from fastapi import FastAPI
import uvicorn
# 1. 创建 FastAPI 应用
app = FastAPI()
# 2. 定义接口函数
@app.get('/demo')
def demo():
return {'result': 100}
# 3. 使用 uvicorn 启动 FastAPI 应用
if __name__ == '__main__':
uvicorn.run(app, host='127.0.0.1', port=8000)
2. 请求方法
| 方法 | 语义 | 典型场景 | 是否改数据 |
|---|---|---|---|
| GET | 查询 / 获取 | 查询列表、详情 | ❌只读 |
| POST | 新建 | 注册、新增订单 | ✅新增数据 |
| PUT | 全量更新 | 完整替换一条记录 | ✅修改 |
| PATCH | 局部更新 | 只改个别字段 | ✅修改 |
| DELETE | 删除 | 删除用户、删除订单 | ✅删除 |
2.1 GET
from fastapi import FastAPI
import uvicorn
app = FastAPI()
# 1. 路径参数
@app.get('/get_path/{uid}')
def get_path(uid):
print('查询用户', uid, '的用户')
return {'status': 'success'}
# 2. 查询参数
@app.get('/get_query')
def get_query(gender : str):
print('查询性别为', gender, '的所有用户!')
return {'status': 'success'}
if __name__ == '__main__':
uvicorn.run(app, host='127.0.0.1', port=8000)
2.2 POST
from fastapi import FastAPI
from pydantic import BaseModel
from fastapi import Form
import uvicorn
app = FastAPI()
# 1. 表单
@app.post('/post_data/')
def post_data(name : str = Form(), age : int = Form(), gender : str = Form()):
print(name, age, gender)
return {'status': 'success'}
# 2. json
class User(BaseModel):
name: str
age: int
gender: str
@app.post('/post_json/')
def post_json(user : User):
print(user)
return {'status': 'success'}
if __name__ == '__main__':
uvicorn.run(app, host='127.0.0.1', port=8000)
2.3 PUT
from fastapi import FastAPI
from pydantic import BaseModel
from fastapi import Form
import uvicorn
app = FastAPI()
class User(BaseModel):
name: str
age: int
gender: str
@app.put('/put/{uid}')
def put(uid : int, user: User):
print(uid, user)
return {'status': 'success'}
if __name__ == '__main__':
uvicorn.run(app, host='127.0.0.1', port=8000)
2.4 PATCH
from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn
app = FastAPI()
class User(BaseModel):
name: str | None = None
age: int | None = None
gender: str | None = None
@app.patch("/patch/{uid}")
def patch(uid : int, data: User):
print(uid, data.model_dump(exclude_unset=True))
return {"status":"ok"}
if __name__ == '__main__':
uvicorn.run(app, host='127.0.0.1', port=8000)
2.5 DELETE
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.delete("/delete/{uid}")
def delete(uid : int):
print('删除用户 ', uid, '的数据!')
return {"status":"ok"}
if __name__ == '__main__':
uvicorn.run(app, host='127.0.0.1', port=8000)
3. 异步任务
在 FastAPI 中定义接口时,我们经常会看到两种写法:
import time
import asyncio
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get('/get_normal/')
def get_normal(uid):
time.sleep(10)
return {'status': 'success'}
@app.get('/get_async/')
async def get_async(uid):
await asyncio.sleep(10)
return {'status': 'success'}
if __name__ == '__main__':
uvicorn.run(app, host='127.0.0.1', port=8000)
二者最核心的区别在于:def 接口通常由线程池中的工作线程执行,而 async def 接口通常由事件循环调度执行。



冀公网安备13050302001966号