以下是针对 FastAPI 的保姆级教程,包含核心概念、完整案例和关键注意事项,采用「基础 → 进阶 → 生产级」的三阶段教学法:
一、FastAPI介绍
FastAPI 是一个现代化的、高性能的 Python Web 框架,专门用于构建 APIs(应用程序编程接口)。以下是它的核心特性和定位:
FastAPI 的本质
-
类型优先的框架:基于 Python 类型提示(Type Hints)
-
异步支持:原生兼容
async/await
语法 -
自动文档生成:内置 OpenAPI(Swagger)和 JSON Schema 支持
-
高性能:媲美 NodeJS 和 Go 的速度(Starlette 底层)
优势
FastAPI 核心优势
-
性能卓越:基于 Starlette(异步)和 Pydantic(类型校验)
-
开发效率:自动生成 Swagger/Redoc 文档
-
类型安全:Python 类型注解驱动
-
异步支持:原生
async/await
支持
对比
特性 | FastAPI | Flask | Django |
---|---|---|---|
异步支持 | ✅ 原生 | ❌ 需扩展 | ❌ 需扩展 |
自动 API 文档 | ✅ 内置 | ❌ 需扩展 | ❌ 需扩展 |
开发速度 | ⚡️ 极快 | 🏎️ 快 | 🐢 中等 |
学习曲线 | 📈 中等 | 📉 低 | 📈 高 |
性能 | 🚀 最高 | 🏎️ 中等 | 🚗 中等 |
核心组件架构
典型应用场景
-
微服务架构:轻量级 API 服务
-
数据科学接口:机器学习模型部署
-
实时应用:WebSocket 支持
-
快速原型开发:即时 API 文档
二、环境准备
# 创建虚拟环境(Python≥3.8)
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
# 安装依赖
pip install "fastapi[all]" uvicorn
三、基础案例:用户管理系统
1. 项目结构
user_api/
├── main.py # 主应用
├── models.py # Pydantic 模型
└── database.py # 模拟数据库
2. 模型定义 (models.py
)
from pydantic import BaseModel, EmailStr
class UserBase(BaseModel):
email: EmailStr
class UserCreate(UserBase):
password: str
class User(UserBase):
id: int
is_active: bool
class Config:
from_attributes = True # 替换原来的 orm_mode
3. 数据库模拟 (database.py
)
from typing import Dict
fake_db: Dict[int, User] = {}
class UserCRUD:
@staticmethod
def create(user: UserCreate) -> User:
user_id = len(fake_db) + 1
db_user = User(id=user_id, email=user.email, is_active=True)
fake_db[user_id] = db_user
return db_user
4. 主应用 (main.py
)
from fastapi import FastAPI, HTTPException
from models import User, UserCreate
from database import UserCRUD
app = FastAPI()
@app.post("/users/", response_model=User)
async def create_user(user: UserCreate):
return UserCRUD.create(user)
@app.get("/users/{user_id}", response_model=User)
async def read_user(user_id: int):
if user_id not in fake_db:
raise HTTPException(status_code=404, detail="User not found")
return fake_db[user_id]
5. 启动与测试
uvicorn main:app --reload
-
访问
http://127.0.0.1:8000/docs
查看交互文档 -
测试请求:
curl -X POST "http://127.0.0.1:8000/users/" \ -H "Content-Type: application/json" \ -d '{"email":"user@example.com","password":"secret"}'
-
注意:若项目结构非上述结构,启动需进入到对应文件目录执行。如图:
四、进阶功能
1. 依赖注入
from fastapi import Depends def get_db(): db = fake_db # 模拟数据库连接 try: yield db finally: pass # 实际场景关闭连接 @app.get("/items/") async def read_items(db: dict = Depends(get_db)): return db
2. 异步数据库
from sqlalchemy.ext.asyncio import AsyncSession @app.post("/async-users/") async def create_async_user( user: UserCreate, db: AsyncSession = Depends(get_async_db) ): # 使用 asyncpg 或 aiomysql 等 pass
3. 中间件
from fastapi import Request @app.middleware("http") async def add_process_time_header(request: Request, call_next): start_time = time.time() response = await call_next(request) response.headers["X-Process-Time"] = str(time.time() - start_time) return response
五、生产级注意事项
1. 安全加固
from fastapi.security import OAuth2PasswordBearer oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") @app.get("/secure/") async def secure_endpoint(token: str = Depends(oauth2_scheme)): return {"token": token}
2. 配置管理
from pydantic_settings import BaseSettings class Settings(BaseSettings): app_name: str = "User API" admin_email: str items_per_page: int = 50 class Config: env_file = ".env"
3. 日志监控
import logging from fastapi.logger import logger logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__)
六、性能优化技巧
-
路由注册顺序:高频路由放前面
-
响应模型优化:
@app.get("/users/", response_model=List[User]) async def read_users(limit: int = 100): # 分页限制 return list(fake_db.values())[:limit]
-
静态文件缓存:
from fastapi.staticfiles import StaticFiles app.mount("/static", StaticFiles(directory="static"), name="static")
七、常见错误解决方案
错误类型 解决方法 422 Validation Error
检查请求体是否符合 Pydantic 模型 ImportError: cannot import name 'UploadFile'
升级 fastapi 版本 异步函数忘记加 await
使用 @router.get()
替代@app.get()
时需注意八、完整项目示例
推荐学习官方示例库:
git clone https://github.com/tiangolo/fastapi-examples
通过这个教程,您已经掌握了从开发到部署 FastAPI 的全流程。建议下一步:
-
集成 Redis 缓存
-
学习 APIFlask 比较异同
-
研究 OpenAPI 扩展规范
九、学习路径建议
-
初级阶段:掌握路由、Pydantic 模型
-
中级阶段:依赖注入、中间件
-
高级阶段:自定义 APIRoute、背景任务
-
专家阶段:ASGI 生命周期钩子、测试策略
FastAPI 的官方文档(https://fastapi.tiangolo.com)提供了最权威的指南,推荐结合实践项目逐步深入。对于已有 Flask/Django 经验的开发者,通常可在 2-3 天内完成转型。