FastAPI:Python的高性能Web框架入门
在这篇教程中,我们将探索FastAPI——一个现代、快速、高性能的Python Web框架,专为API开发而设计。即使你是Web开发新手,也能快速上手并构建高效的API服务。
为什么选择FastAPI?
FastAPI具有许多令人印象深刻的特性,使其成为Python开发者的首选工具:
🚀 高性能
性能与NodeJS和Go相当,是Python最快的Web框架之一
📝 自动文档
自动生成交互式API文档,支持Swagger UI和ReDoc
✅ 类型提示
基于Python类型提示的数据校验和序列化
🔍 易于学习
简洁直观的API设计,易于上手和使用
环境准备
首先,我们需要安装FastAPI和ASGI服务器Uvicorn:
pip install fastapi uvicorn
第一个FastAPI应用
创建一个名为main.py
的文件,编写以下内容:
from fastapi import FastAPI
# 创建FastAPI实例app = FastAPI()
# 定义根路由@app.get("/")def read_root(): return {"message": "Hello World"}
# 带参数的路由@app.get("/items/{item_id}")def read_item(item_id: int, q: str = None): return {"item_id": item_id, "q": q}
运行应用:
uvicorn main:app --reload
现在,访问 http://127.0.0.1:8000 就能看到API返回的JSON响应了!
💡 提示
—reload 参数使服务器在代码变更时自动重启,非常适合开发阶段使用
请求体和数据模型
FastAPI使用Pydantic库进行数据验证。通过定义数据模型,可以轻松处理请求体:
from fastapi import FastAPIfrom pydantic import BaseModel
app = FastAPI()
# 定义数据模型class Item(BaseModel): name: str price: float is_offer: bool = None
@app.post("/items/")def create_item(item: Item): return item
这段代码定义了一个Item
模型,当客户端发送POST请求时,FastAPI会自动:
- 解析JSON请求体
- 验证数据类型
- 提供完整的编辑器支持和错误提示
参数验证
FastAPI提供了丰富的验证功能,确保输入数据符合预期:
from fastapi import FastAPI, Path, Query
app = FastAPI()
@app.get("/items/{item_id}")def read_item( item_id: int = Path(..., title="The ID of the item", ge=1), q: str = Query(None, max_length=50)): return {"item_id": item_id, "q": q}
上面的代码实现了:
item_id
必须大于等于1- 查询参数
q
的最大长度为50个字符
FastAPI会自动生成错误响应
当用户提供无效数据时,会返回清晰的错误信息,包括错误位置和原因。
依赖注入系统
FastAPI的依赖注入系统使代码组织更加灵活:
from fastapi import FastAPI, Depends, HTTPException
app = FastAPI()
def common_parameters(q: str = None, skip: int = 0, limit: int = 100): return {"q": q, "skip": skip, "limit": limit}
@app.get("/items/")def read_items(commons: dict = Depends(common_parameters)): return {"commons": commons}
@app.get("/users/")def read_users(commons: dict = Depends(common_parameters)): return {"commons": commons}
这样就能在多个路径操作之间共享代码,同时保持代码的可读性和可维护性。
自动生成API文档
FastAPI最强大的功能之一是自动生成交互式API文档:
Swagger UI
访问 /docs
路径即可获得基于Swagger UI的交互式文档
ReDoc
访问 /redoc
路径获得基于ReDoc的另一种风格文档
这些文档不仅可以查看API规范,还可以直接在页面上测试API调用!
实用示例:构建待办事项API
下面是一个实用的待办事项API示例:
from fastapi import FastAPI, HTTPExceptionfrom pydantic import BaseModelfrom typing import List, Optionalfrom uuid import uuid4, UUID
app = FastAPI(title="待办事项API")
# 数据模型class TodoCreate(BaseModel): title: str description: Optional[str] = None completed: bool = False
class Todo(TodoCreate): id: UUID
# 内存存储todos = []
@app.post("/todos/", response_model=Todo)def create_todo(todo: TodoCreate): new_todo = Todo(id=uuid4(), **todo.dict()) todos.append(new_todo) return new_todo
@app.get("/todos/", response_model=List[Todo])def read_todos(skip: int = 0, limit: int = 10): return todos[skip : skip + limit]
@app.get("/todos/{todo_id}", response_model=Todo)def read_todo(todo_id: UUID): for todo in todos: if todo.id == todo_id: return todo raise HTTPException(status_code=404, detail="Todo not found")
@app.put("/todos/{todo_id}", response_model=Todo)def update_todo(todo_id: UUID, todo: TodoCreate): for i, saved_todo in enumerate(todos): if saved_todo.id == todo_id: updated_todo = Todo(id=todo_id, **todo.dict()) todos[i] = updated_todo return updated_todo raise HTTPException(status_code=404, detail="Todo not found")
@app.delete("/todos/{todo_id}")def delete_todo(todo_id: UUID): for i, todo in enumerate(todos): if todo.id == todo_id: del todos[i] return {"detail": "Todo deleted"} raise HTTPException(status_code=404, detail="Todo not found")
总结
FastAPI是一个强大而优雅的Python Web框架,它结合了现代Python特性,提供了出色的开发体验:
- 开发速度快:直观的API设计和出色的文档
- 执行速度快:基于Starlette和Pydantic的高性能实现
- 错误减少:强类型系统和自动数据验证
- 易于维护:清晰的代码结构和依赖注入系统
无论你是构建简单的微服务,还是复杂的API后端,FastAPI都能帮助你高效地完成任务。
学习资源
开始使用FastAPI,享受Python Web开发的乐趣吧!