FastAPI 是一个现代、高性能的 Python Web 框架,专为构建 API 而生。它基于 Python 的类型提示,能够自动进行数据校验并生成 API 文档,是当前 Python 生态中增长最快的 Web 框架之一。
FastAPI 的核心特性
FastAPI 之所以备受青睐,主要得益于它这些“自带光环”的特性:
极高的性能:基于 Starlette(异步框架)和 Pydantic(数据校验库)构建,性能可媲美 Node.js 和 Go,在 Python Web 框架中处于顶尖水平。
自动生成 API 文档:无需手动编写,代码即文档。它会自动为你生成交互式 Swagger UI (
/docs) 和 ReDoc (/redoc) 文档,极大方便了调试和前后端协作。强大的数据校验:利用 Pydantic 和 Python 类型提示,能自动校验请求体、查询参数等,确保数据准确,并在校验失败时自动返回清晰的错误信息。
原生异步支持:完美支持
async/await语法,能高效处理高并发 I/O 场景,非常适合构建微服务和实时 Web 应用。灵活的依赖注入系统:通过
Depends机制,可以轻松管理数据库会话、权限验证、配置等依赖,让代码更解耦、更易于测试和复用。
使用
1. 安装与环境准备
建议创建一个虚拟环境来隔离项目依赖。
# 创建并激活虚拟环境 (以venv为例) python -m venv venv source venv/bin/activate # Linux/macOS # venv\Scripts\activate # Windows # 安装 FastAPI 和 ASGI 服务器 Uvicorn pip install fastapi uvicorn[standard]2. 编写第一个 API
创建一个main.py文件:
from fastapi import FastAPI # 1. 创建 FastAPI 应用实例 app = FastAPI() # 2. 定义路径操作装饰器 (根路径 /) @app.get("/") async def read_root(): # 返回 JSON 响应 return {"message": "Hello, FastAPI!"} # 3. 定义另一个带路径参数的 API @app.get("/items/{item_id}") async def read_item(item_id: int, q: str = None): return {"item_id": item_id, "query": q}3. 启动服务
在终端中运行以下命令:
uvicorn main:app --reloadmain:指main.py文件。app:指文件中创建的FastAPI实例。--reload:开启热重载,代码修改后服务器会自动重启,方便开发。
4. 查看效果
服务启动后,可以访问以下地址:
API 端点:
http://127.0.0.1:8000/或http://127.0.0.1:8000/items/5Swagger UI 文档:
http://127.0.0.1:8000/docsReDoc 文档:
http://127.0.0.1:8000/redoc
路由与参数
定义路由
使用装饰器@app.get()、@app.post()、@app.put()、@app.delete()等来定义对应 HTTP 方法的路由。
from fastapi import FastAPI app = FastAPI() @app.get("/users/") async def get_users(): return [{"username": "alice"}, {"username": "bob"}] @app.post("/users/") async def create_user(): # 创建用户的逻辑 return {"message": "User created"}参数处理
FastAPI 能自动识别三种主要参数类型。
1. 路径参数
从 URL 路径中获取参数,并支持类型声明和校验。
from fastapi import FastAPI, Path app = FastAPI() @app.get("/books/{book_id}") async def get_book( # 路径参数 book_id, 类型为 int, 校验其值大于 0 且小于 101 book_id: int = Path(..., title="书籍ID", ge=1, le=100) ): return {"book_id": book_id}2. 查询参数
URL 中问号后的键值对,如/items?skip=0&limit=10。
from fastapi import FastAPI, Query app = FastAPI() @app.get("/items/") async def list_items( # 查询参数 skip 和 limit,带默认值和描述 skip: int = Query(0, description="跳过的记录数"), limit: int = Query(10, description="返回的记录数") ): return {"skip": skip, "limit": limit}3. 请求体参数
用于POST、PUT等请求,将 JSON 数据映射到 Pydantic 模型中。
from fastapi import FastAPI from pydantic import BaseModel, Field app = FastAPI() # 1. 定义请求体的数据结构 class UserCreate(BaseModel): username: str = Field(..., min_length=3, max_length=20, description="用户名") password: str = Field(..., min_length=6, description="密码") @app.post("/register/") async def register_user(user: UserCreate): # FastAPI 会自动将 JSON 请求体解析为 UserCreate 实例 return {"message": f"User {user.username} registered"}核心功能
| 功能 | 说明 | 示例场景 |
|---|---|---|
| 依赖注入 | 通过Depends注入数据库会话、配置、认证等依赖,实现解耦和复用。 | db: Session = Depends(get_db) |
| 响应模型 | 使用response_model参数来过滤和格式化输出数据,确保 API 返回结构一致。 | @app.get("/user", response_model=UserOut) |
| 中间件 | 处理请求和响应的全局逻辑,如日志记录、CORS 配置。 | 全局异常捕获、跨域设置。 |
| 后台任务 | 使用BackgroundTasks将发送邮件、处理图片等耗时操作放到后台异步执行,不阻塞响应。 | 用户注册后发送欢迎邮件。 |
| 文件上传 | 通过UploadFile类型轻松处理文件上传。 | 用户头像上传。 |
| WebSocket | 支持 WebSocket 协议,用于构建聊天、实时通知等应用。 | 实时聊天室。 |