FastAPI到底有多快?手把手教你打造高性能API(实测对比)
"用FastAPI写接口到底有多快?"这个问题我最近被问了不下十次!今天就带大家用实际代码测试对比一波,顺便手把手教你从零开始搭建一个高性能API服务(绝对比你想的更简单)!
🤯 先来看实测数据!
为了公平起见,我分别在AWS t3.micro实例(1vCPU/1GB内存)上部署了三个框架的Hello World接口:
```python
Flask版本
@app.route('/')
def hello():
return {'message': 'Hello World'}
Django REST Framework版本
class HelloView(APIView):
def get(self, request):
return Response({'message': 'Hello World'})
FastAPI版本
@app.get("/")
async def root():
return {"message": "Hello World"}
```
用wrk压测工具进行基准测试(100并发持续30秒):
| 框架 | 请求/秒 | 延迟(ms) | 内存占用(MB) |
|--------------|---------|----------|-------------|
| Flask | 1227 | 81.36 | 45 |
| Django REST | 879 | 113.54 | 112 |
| FastAPI | 5342| 18.72| 28 |
(数据真实可复现)是不是被这个差距惊到了?FastAPI的性能直接碾压传统框架啊!
🚀 3分钟快速上手
安装只需一行命令:
bash
pip install fastapi[all]
创建main.py:
```python
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
```
启动服务:
bash
uvicorn main:app --reload
打开http://127.0.0.1:8000/docs 就能看到自动生成的交互式文档!这个自动文档功能绝对是开发者的福音(再也不用手动写接口文档了)
💡 五大必杀技解析
1. 异步支持(Async/Await)
传统框架在处理IO密集型操作时会阻塞线程,FastAPI天生支持异步:
python
@app.get("/user/{user_id}")
async def get_user(user_id: str):
user_data = await fetch_from_db(user_id) # 模拟数据库查询
return user_data
2. 类型提示与数据验证
用Python类型提示自动验证请求参数:
```python
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
tags: list[str] = []
@app.post("/items/")
async def create_item(item: Item):
if item.price < 0:
raise HTTPException(status_code=400, detail="价格不能为负")
return item
```
3. 依赖注入系统
轻松管理共享逻辑:
```python
from fastapi import Depends
def get_db():
db = DBSession()
try:
yield db
finally:
db.close()
@app.get("/users/")
async def get_users(db: Session = Depends(get_db)):
return db.query(User).all()
```
4. 后台任务处理
长时间任务不阻塞主线程:
```python
from fastapi import BackgroundTasks
def write_log(message: str):
with open("log.txt", "a") as f:
f.write(f"{datetime.now()}: {message}\n")
@app.post("/send-email/")
async def send_email(
background_tasks: BackgroundTasks,
email: EmailSchema
):
background_tasks.add_task(send_email_task, email)
return {"message": "邮件已在后台发送"}
```
5. WebSocket支持
实时通信轻松实现:
```python
from fastapi import WebSocket
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
while True:
data = await websocket.receive_text()
await websocket.send_text(f"收到消息: {data}")
```
🔥 进阶技巧
中间件定制
自定义跨域处理:
```python
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=[""],
allow_methods=[""],
allow_headers=["*"],
)
```
响应模型转换
过滤敏感字段:
```python
class UserIn(BaseModel):
username: str
password: str
class UserOut(BaseModel):
username: str
@app.post("/user/", response_model=UserOut)
async def create_user(user: UserIn):
return user # 自动过滤password字段
```
自定义异常处理
统一错误响应:
```python
from fastapi import HTTPException, Request
from fastapi.responses import JSONResponse
@app.exception_handler(HTTPException)
async def custom_exception_handler(request: Request, exc: HTTPException):
return JSONResponse(
status_code=exc.status_code,
content={"error": exc.detail, "path": request.url.path},
)
```
🚨 避坑指南
别在路径操作函数里写阻塞代码
比如直接调用time.sleep(10)会阻塞整个事件循环,应该用:
python
await asyncio.sleep(10)
注意Pydantic模型嵌套
处理嵌套模型时记得用List和Dict:
```python
from typing import List, Dict
别在路径操作函数里写阻塞代码
比如直接调用time.sleep(10)会阻塞整个事件循环,应该用:
python
await asyncio.sleep(10)
注意Pydantic模型嵌套
处理嵌套模型时记得用List和Dict:
```python
from typing import List, Dict
class Data(BaseModel):
matrix: List[List[float]]
metadata: Dict[str, str]
```
- 生产环境配置
部署时记得关掉reload和debug:
bash
uvicorn main:app --host 0.0.0.0 --port 80 --workers 4
最后说句大实话
FastAPI虽然性能爆表,但别盲目追新!如果你的项目:
- 需要CMS后台 ⇒ 选Django
- 简单微服务 ⇒ Flask更轻量
- 高并发API ⇒ FastAPI当仁不让
不过用过FastAPI之后,我真回不去传统框架了——开发效率提升至少50%,性能直接起飞!各位Python开发者,这个框架绝对值得你花一个周末试试看!
浙公网安备 33010602011771号