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
英文地址,請注明出處:http://en.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; 日請求…