FastAPI 入門:為什么選擇 FastAPI?它比 Flask 強在哪里?
FastAPI 是什么?
FastAPI[1] 是一個基于 Python 3.7+ 的現代化 異步 Web 框架,適用于構建 高性能 API。它具有以下特點:
- 超快性能(接近 Node.js 和 Go)
- 自動生成文檔(Swagger & ReDoc)
- Pydantic 強類型數據驗證
- 異步支持(async/await),天生適合高并發任務
- 與 Flask 語法相似,上手簡單
FastAPI = Flask + Pydantic + 自動文檔 + 超快性能。
FastAPI vs Flask:到底哪個好?
?? 對比項 | ?? FastAPI | ?? Flask |
性能 | 異步支持,超快 (比 Flask 快 3~5 倍) | 同步阻塞 ,性能相對較低 |
類型檢查 | Pydantic 強類型驗證,減少錯誤 | 手動解析請求數據,易出錯 |
自動文檔 | 內置 Swagger 和 ReDoc | 需手動集成 Swagger |
異步支持 | 天生支持 async/await,高并發任務不阻塞 | 需要手動使用線程池或協程 |
學習成本 | 比 Flask 略高,但上手快 | 語法簡單,適合初學者 |
適用場景 | 高性能 API、微服務、異步應用 | 小型 Web 項目、簡單 API |
結論:
- 想要極致性能?→ 選 FastAPI!
- 項目簡單,團隊習慣 Flask?→ 選 Flask!
- 未來趨勢?→ FastAPI 正在取代 Flask!
快速上手:第一個 FastAPI API
安裝 FastAPI 和 Uvicorn(服務器):
pip install fastapi uvicorn
創建 main.py:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "?? Hello, FastAPI!"}
啟動服務:
uvicorn main:app --reload
訪問 API:
- Swagger 文檔 ?? http://127.0.0.1:8000/docs
- ReDoc 文檔 ?? http://127.0.0.1:8000/redoc
?? FastAPI 直接生成交互式 API 文檔,開發體驗超級棒!
FastAPI 的異步支持(async/await)
FastAPI 原生支持異步(async/await),相比 Flask 只能同步處理請求,FastAPI 可以同時處理多個請求,避免阻塞,大幅提升性能。
(1) Flask(同步處理)
Flask 處理請求時是 阻塞的,一個請求執行時,其他請求必須等待:
from flask import Flask
import time
app = Flask(__name__)
@app.route("/")
def slow():
time.sleep(5) # 模擬耗時任務
return "Flask 任務完成!"
app.run(debug=True)
如果有多個請求,Flask 會一個個處理,性能較低。
(2) FastAPI(異步處理)
FastAPI 允許 異步執行任務,多個請求可以同時執行:
from fastapi import FastAPI
import asyncio
app = FastAPI()
@app.get("/")
async def slow():
await asyncio.sleep(5) # 使用 async/await 實現異步
return {"message": "FastAPI 任務完成!"}
FastAPI 采用 異步 I/O,多個請求可以 同時進行,大幅提升響應速度!
FastAPI 的多任務特性(異步并發處理)
FastAPI 支持多任務異步執行,適用于 I/O 密集型任務,如:
- 多個數據庫查詢(避免阻塞)
- 爬蟲、批量網絡請求(加速處理)
- 同時下載多個文件(并發提升速度)
(1) 讓多個任務同時執行(asyncio.gather)
from fastapi import FastAPI
import asyncio
app = FastAPI()
asyncdeftask_1():
await asyncio.sleep(3)
return"任務 1 完成"
asyncdeftask_2():
await asyncio.sleep(2)
return"任務 2 完成"
@app.get("/multi-task")
asyncdefmulti_task():
result = await asyncio.gather(task_1(), task_2()) # 并發執行兩個任務
return {"results": result}
解析:
- asyncio.gather(task_1(), task_2()) 會同時執行 task_1() 和 task_2(),而不是順序執行
- 執行時間不會疊加,而是取最長的那個(本例中 3 秒)
- 比同步執行快 50%+!
(2) 使用后臺任務(BackgroundTasks)
FastAPI 提供 BackgroundTasks,適用于不影響主請求的任務(如發送郵件、日志記錄):
from fastapi import FastAPI, BackgroundTasks
app = FastAPI()
def write_log(msg: str):
with open("log.txt", "a") as f:
f.write(msg + "\n")
@app.get("/task")
def start_task(background_tasks: BackgroundTasks):
background_tasks.add_task(write_log, "異步任務執行!")
return {"message": "任務已提交"}
解析:
- background_tasks.add_task(write_log, "異步任務執行!") 不會阻塞主請求
- 請求立即返回 "任務已提交",而后臺任務 write_log() 繼續運行
適用于日志、郵件、緩存更新等場景!
FastAPI 的核心功能
- 路由(GET, POST, PUT, DELETE)
- 路徑參數 & 查詢參數
- 數據驗證(Pydantic)
- 依賴注入(Depends)
- 數據庫支持(SQLAlchemy, Tortoise-ORM)
- JWT 認證 & OAuth2
- WebSockets & 背景任務
- Docker & 部署優化
什么時候選擇 FastAPI?
如果你的項目需要:
- 高并發、異步處理(如爬蟲、微服務、實時數據)
- 自動生成 API 文檔,快速對接前端
- 更嚴格的數據驗證,減少錯誤
- 更快的響應速度(比 Flask 快 3~5 倍)
那么 FastAPI 是你的最佳選擇!
結論:FastAPI 是未來!
Flask 適合簡單項目,但 FastAPI 更現代化、更快、更強大,已經成為 Python Web 開發的新寵。