FastAPI + React:现代 Web 前后端分离开发的全栈实践指南

一、为什么选 FastAPI + React?

  1. 性能:FastAPI 基于 Starlette + Uvicorn,QPS 与 Node/Go 同级,实测 3 倍于 Flask;React 虚拟 DOM + 代码分割,首屏 < 1.2 s。
  2. 效率:FastAPI 内置 Swagger/OpenAPI,前端可一键生成 TypeScript SDK;React 组件化 + Hooks,业务逻辑复用率提升 40 %。
  3. 生态:FastAPI 原生支持 Pydantic、SQLAlchemy、OAuth2;React 拥有 Ant-Design、Tailwind、Next.js 等全家桶。
  4. 人才: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 分钟搭好

  1. 后端
python -m venv venv && source venv/bin/activate
pip install fastapi[all] sqlalchemy alembic passlib[bcrypt] python-jose[cryptography]
uvicorn main:app --reload
  1. 前端
npm create vite@latest frontend --template react-ts
cd frontend && npm i axios react-query@tanstack/react-query zustand
npm run dev
  1. 跨域
    FastAPI 一行解决:
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(CORSMiddleware,allow_origins=["http://localhost:5173"],allow_credentials=True,allow_methods=["*"],allow_headers=["*"])

四、核心代码示例

  1. 后端:用户注册 + 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"}
  1. 前端: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 } }
})
  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 devuvicorn main:app --reload
集成测试npm run build && npm run previewdocker compose up
一键全栈concurrently "npm run dev" "uvicorn main:app --reload"

七、生产部署

  1. 前端
# .github/workflows/deploy.yml
- uses: cloudflare/pages-action@v1with:apiToken: ${{ secrets.CF_API_TOKEN }}accountId: ${{ secrets.CF_ACCOUNT_ID }}projectName: myappdirectory: frontend/dist
  1. 后端
    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 个实例。

  1. HTTPS + 域名
    Cloudflare CDN → ALB → ECS,证书由 ACM 托管,强制 TLS 1.3。

八、常见坑与对策

问题现象解决方案
CORS 失败浏览器报 403确认 allow_origins 与前端端口一致
热更新失效React 页面不刷新vite.config.ts 里 server.proxy 指到 FastAPI
大文件上传413 Request Entity Too LargeFastAPI max_request_size=50MB,Nginx client_max_body_size 50M;
内存泄漏ECS 任务 OOMSQLAlchemy 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 项目,这套组合值得你立即尝试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93609.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式硬件篇---电平转换电路

电平转换电路是电子电路中用来实现不同电压信号之间转换的关键电路&#xff0c;比如把 3.3V 的信号转换成 5V&#xff0c;或者把 5V 转换成 1.8V&#xff0c;确保不同电压的芯片、模块能正常通信。下面用通俗易懂的方式介绍几种常见的电平转换电路&#xff1a;一、电阻分压电路…

SAP ABAP IS SUPPLIED

效果 此谓词表达式用于检查过程的某个形式参数“para”是否已赋值或被请求使用。如果在调用时实际参数被赋值给了该形式参数&#xff0c;则该表达式为真。 这种关系表达式仅能在函数模块和方法中使用。而对于“para”而言&#xff0c;所有可选的形参都可以进行指定。 加上“NOT…

视频内容提取与AI总结:提升学习效率的实用方法

文章目录1、前言2、方法介绍2.1 B站视频处理方案2.2 通用视频处理方案2.3 AI内容总结3、实际效果4、使用建议5、技术发展趋势6、总结&#x1f343; 作者介绍&#xff1a;25届双非本科网络工程专业&#xff0c;阿里云专家博主&#xff0c;专注于 AI 原理、AI 应用开发、AI 产品设…

JVM 面试精选 20 题

目录1. 什么是 JVM、JDK 和 JRE&#xff1f;它们之间的关系是什么&#xff1f;2. Java 内存区域&#xff08;运行时数据区&#xff09;有哪些&#xff1f;3. 说说你对 JVM 垃圾回收机制的理解。4. 常用的垃圾回收算法有哪些&#xff1f;5. 什么是 Minor GC、Major GC 和 Full G…

CMIP6 气候模式核心特性解析

在全球气候变化研究中&#xff0c;CMIP6&#xff08;第六次耦合模式比较计划&#xff09;的气候模式是关键工具。以下从研发背景与核心能力角度&#xff0c;解析五类主流模式的技术特点与适用场景。 一、主流模式技术特性 1. CanESM5/CanESM5-1&#xff08;加拿大环境与气候变…

【牛客刷题】BM63 跳台阶:三种解法深度解析(递归/DP动态规划/记忆化搜索)

文章目录 一、题目介绍 1.1 题目描述 1.2 示例 二、算法设计思路 2.1 核心问题分析 2.2 斐波那契数列关系 三、流程图 解法1:递归法(自顶向下) 解法2:动态规划(自底向上) 解法3:记忆化搜索(递归优化) 解法4: 优化DP流程(推荐) 四、解法实现 五、复杂度分析对比 六、…

《解构WebSocket断网重连:指数退避算法的前端工业级实践指南》

WebSocket作为客户端与服务器双向通信的核心载体,支撑着从在线协作、金融行情到即时通讯等各类高实时性场景。然而,网络环境的动态变化—从用户设备的Wi-Fi与蜂窝网络切换,到公共网络的临时拥塞,再到服务器的短暂重启—都可能导致WebSocket连接中断,进而引发数据传输停滞、…

医疗洁净间的“隐形助手”:富唯智能复合机器人如何重塑手术器械供应链

当手术刀片在无影灯下传递时&#xff0c;0.01mm的抓取偏差可能意味着感染风险——而富唯智能复合机器人以0.02mm的重复定位精度与99.999%无菌操作的硬实力&#xff0c;正成为高端医疗产线中替代人力的关键技术支点。一、医疗上下料的三大痛点&#xff1a;精度、洁净与连续性1.毫…

《设计模式》工厂方法模式

1.工厂方法模式&#xff08;Factory Method&#xff09;定义 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 1.1 UML图&#xff1a; 主要有4个对象&#xff1a; 抽象工厂&#xff08;Abstract Creator&#xf…

冒泡排序——简单理解和使用

阅前声明&#xff1a;如果想直接了解冒泡排序的简化思想&#xff0c;请跳至文章尾部在介绍之前&#xff0c;我们先看一个用到该功能的实战训练&#xff08;本人也是从中开始认识到冒泡排序这个函数定义&#xff09;对于小白来说&#xff0c;我的思路如下&#xff1a;1.题目中涉…

AI应用商业化加速落地 2025智能体爆发与端侧创新成增长引擎

今年以来&#xff0c;人工智能 (AI) 正在进入从算力投入到云服务消耗再到商业化收入&#xff0c;最终回到算力再投入的良性循环&#xff0c;而 AI 应用的起量正是推动这一飞轮效应的关键。7 月 31 日&#xff0c;国务院常务会议审议通过了《关于深入实施 “人工智能 ” 行动的意…

Pytest测试框架基础及进阶

Pytest测试框架基础# Pytest测试框架介绍# Pytest是Python一款三方测试框架&#xff0c;用于编写和运行单元测试、集成测试和功能测试。Pytest测试框架具有简单、灵活、易于扩展等特点&#xff0c;被广泛应用于Python项目的测试工作中。 Pytest主要特点&#xff1a; 简单易用…

航空装备先进加工工艺与制造技术论坛——2025成都航空装备展

300参展企业 11500㎡展区面积 7大专业展区 12000观众规模15同期会议 160发言嘉宾 5000参会嘉宾 100媒体报道航空工业飞速发展&#xff0c;先进加工工艺与制造技术成为了支撑航空装备性能提升、质量保障和产能优化的核心基石。为探索前沿技术路径、凝聚行业创新力量&#xff0c;…

为什么品牌更愿意为新品打广告?

品牌资源向新品广告倾斜&#xff0c;可以说是市场上的普遍现象。尤其对于没有明星产品的品牌而言&#xff0c;新品推广时企业的重要曝光节点。下面就让我们一同来了解下&#xff0c;为什么品牌更愿意为新品打广告。一、市场需求更充分新品广告往往承担着市场教育的功能&#xf…

电子电气架构 --- 关于整车信息安全的一些思考

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

报错:Eplan无法打开数据库的解决方法

详细报错信息&#xff1a;无法打开数据库 E:\eplan\部件\Microsoft\ESS_part001.mdb。针对64位版本的EPLAN 平台需要使用64位版本的Microsoft Office. 一、报错及解决方法 报错信息&#xff1a;无法打开数据库 E:\eplan\部件\Microsoft\ESS_part001.mdb。针对64位版本的EPLAN 平…

深度学习篇---卷积核的权重

卷积核权重&#xff1a;在深度学习的卷积操作中&#xff0c;“卷积核的权重” 是最核心的概念之一&#xff0c;它决定了卷积核能从图像中 “看到” 什么特征&#xff08;比如边缘、纹理&#xff0c;甚至是眼睛、车轮这样的复杂结构&#xff09;。我们可以把它理解成卷积核的 “…

SMTPman,smtp ssl助力安全高效邮件传输!

SMTPman&#xff0c;smtp ssl助力安全高效邮件传输&#xff01;SMTPman&#xff0c;smtp ssl不仅仅是一种邮件协议方式&#xff0c;更是企业日常运营的重要支撑。通过SMTPman&#xff0c;smtp ssl&#xff0c;用户可以获得更快的投递速度&#xff0c;更稳定的连接&#xff0c;以…

学习日志37 python

1 Python 和 Java 在类属性&#xff08;静态属性&#xff09;和实例属性的处理题目执行以下程序&#xff0c;输出结果为&#xff08;&#xff09; class Base(object):count 0def __init__(self):pass b1 Base() b2 Base() b1.count b1.count 1 print(b1.count,end" …

对于QPS的理解和简单

QPS&#xff08;Queries Per Second&#xff09; 是衡量系统吞吐量的核心指标&#xff0c;表示每秒能处理的请求数量。以下是关于QPS的完整解析和实践指南&#xff1a;一、QPS的核心公式 QPS 总请求量 / 请求总时间&#xff08;秒&#xff09;典型场景计算&#xff1a; 日请求…