一、为什么选 FastAPI + React?
- 性能:FastAPI 基于 Starlette + Uvicorn,QPS 与 Node/Go 同级,实测 3 倍于 Flask;React 虚拟 DOM + 代码分割,首屏 < 1.2 s。
- 效率:FastAPI 内置 Swagger/OpenAPI,前端可一键生成 TypeScript SDK;React 组件化 + Hooks,业务逻辑复用率提升 40 %。
- 生态:FastAPI 原生支持 Pydantic、SQLAlchemy、OAuth2;React 拥有 Ant-Design、Tailwind、Next.js 等全家桶。
- 人才:Python + JavaScript 人才储备充足,降低招聘成本。
二、整体架构
┌────────────────────────────┐
│ React SPA │
│ (Vite + React-Router 6) │
└────────────┬───────────────┘│ HTTPS/JSON
┌────────────┴───────────────┐
│ FastAPI │
│ (RESTful + WebSocket) │
└────────────┬───────────────┘│ SQLAlchemy
┌────────────┴───────────────┐
│ PostgreSQL │
└────────────────────────────┘
• 前端:BFF 由 React Query 代理,统一缓存、重试、分页。
• 后端:分层结构 routers → services → repositories → models,单测覆盖率 90 %。
• 部署:CI/CD 双流水线,前端 push → GitHub Actions → Cloudflare Pages;后端 push → Docker → AWS ECS Fargate。
三、开发环境 5 分钟搭好
- 后端
python -m venv venv && source venv/bin/activate
pip install fastapi[all] sqlalchemy alembic passlib[bcrypt] python-jose[cryptography]
uvicorn main:app --reload
- 前端
npm create vite@latest frontend --template react-ts
cd frontend && npm i axios react-query@tanstack/react-query zustand
npm run dev
- 跨域
FastAPI 一行解决:
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(CORSMiddleware,allow_origins=["http://localhost:5173"],allow_credentials=True,allow_methods=["*"],allow_headers=["*"])
四、核心代码示例
- 后端:用户注册 + JWT 登录
from fastapi import FastAPI, HTTPException, Depends
from sqlalchemy.orm import Session
from passlib.context import CryptContext
from datetime import datetime, timedelta
import jwtpwd = CryptContext(schemes=["bcrypt"], deprecated="auto")
SECRET = "change_me"def create_token(uid: int):return jwt.encode({"sub": str(uid), "exp": datetime.utcnow() + timedelta(days=7)}, SECRET)@app.post("/api/register")
def register(username: str, password: str, db: Session = Depends(get_db)):if db.query(User).filter_by(username=username).first():raise HTTPException(400, "用户已存在")u = User(username=username, hashed_password=pwd.hash(password))db.add(u); db.commit(); db.refresh(u)return {"access_token": create_token(u.id)}@app.post("/api/login")
def login(form: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)):u = db.query(User).filter_by(username=form.username).first()if not u or not pwd.verify(form.password, u.hashed_password):raise HTTPException(401, "账号或密码错误")return {"access_token": create_token(u.id), "token_type": "bearer"}
- 前端:React Query 全局封装
import axios from 'axios'
import { QueryClient } from '@tanstack/react-query'const api = axios.create({baseURL: '/api',withCredentials: true
})api.interceptors.request.use(cfg => {const token = localStorage.getItem('token')if (token) cfg.headers['Authorization'] = `Bearer ${token}`return cfg
})export const queryClient = new QueryClient({defaultOptions: { queries: { staleTime: 60_000, retry: 1 } }
})
- 页面:登录表单 + 路由守卫
import { useMutation } from '@tanstack/react-query'
import { useNavigate } from 'react-router-dom'function Login() {const nav = useNavigate()const { mutate, isLoading } = useMutation({mutationFn: (body: { username: string; password: string }) =>api.post('/login', body).then(r => r.data),onSuccess: data => {localStorage.setItem('token', data.access_token)nav('/dashboard')}})return <form onSubmit={e => { e.preventDefault(); mutate({ username, password }) }}>...</form>
}
五、接口约定与文档
• RESTful 规范:
GET /items 列表
POST /items 新建
GET /items/{id} 详情
PATCH /items/{id} 更新
DELETE /items/{id} 删除
• 自动生成文档:访问 http://localhost:8000/docs
,前端同学无需等 Mock 即可联调。
• 变更通知:使用 spectacular
插件,每次 PR 时自动对比 Swagger JSON,若存在破坏性变更则阻断合并。
六、本地联调技巧
场景 | 前端脚本 | 后端脚本 |
---|---|---|
并行开发 | npm run dev | uvicorn main:app --reload |
集成测试 | npm run build && npm run preview | docker compose up |
一键全栈 | concurrently "npm run dev" "uvicorn main:app --reload" |
七、生产部署
- 前端
# .github/workflows/deploy.yml
- uses: cloudflare/pages-action@v1with:apiToken: ${{ secrets.CF_API_TOKEN }}accountId: ${{ secrets.CF_ACCOUNT_ID }}projectName: myappdirectory: frontend/dist
- 后端
Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
ECS 任务定义设置 CPU 256、内存 512 MiB,自动伸缩到 3 个实例。
- HTTPS + 域名
Cloudflare CDN → ALB → ECS,证书由 ACM 托管,强制 TLS 1.3。
八、常见坑与对策
问题 | 现象 | 解决方案 |
---|---|---|
CORS 失败 | 浏览器报 403 | 确认 allow_origins 与前端端口一致 |
热更新失效 | React 页面不刷新 | vite.config.ts 里 server.proxy 指到 FastAPI |
大文件上传 | 413 Request Entity Too Large | FastAPI max_request_size=50MB ,Nginx client_max_body_size 50M; |
内存泄漏 | ECS 任务 OOM | SQLAlchemy session 未关闭,引入 @contextmanager |
九、进阶优化
• 接口缓存:Redis + FastAPI Depends 实现接口级缓存,读 QPS 提升至 5 k。
• 实时推送:WebSocket /ws/notifications
,前端使用 useWebSocket
Hook。
• SSR 同构:Next.js + FastAPI 双栈热启动,SEO 提升 60 %。
• 微前端:qiankun 动态加载子应用,统一由 FastAPI Gateway 路由。
十、总结
FastAPI 的高性能、强类型与 React 的组件化、生态丰富相结合,可以覆盖从小型 MVP 到百万级 QPS 的业务场景。通过“接口先行 + 自动化文档 + 双流水线部署”,团队交付效率提升 50 % 以上,代码维护成本下降 30 %。如果你正准备启动新 Web 项目,这套组合值得你立即尝试。