FastAPI 全面指南:功能解析與應用場景實踐

FastAPI 全面指南:功能解析與應用場景實踐

FastAPI 是一個現代、快速(高性能)的 Python Web 框架,用于構建 API。它基于標準 Python 類型提示,使用 Starlette 和 Pydantic 構建,提供了極高的性能并簡化了開發流程。本文將深入探討 FastAPI 的核心功能、應用場景,并通過豐富的代碼示例展示其強大能力。

1. FastAPI 簡介與特點

FastAPI 是近年來 Python Web 開發領域最受關注的框架之一,它具有以下顯著特點:

  • 極高性能:可與 NodeJS 和 Go 比肩,是最快的 Python web 框架之一
  • 高效編碼:提高功能開發速度約 200%至 300%
  • 自動文檔:內置 Swagger UI 和 ReDoc 文檔生成
  • 類型安全:基于 Python 類型提示,減少約 40%的人為錯誤
  • 異步支持:原生支持 async/await 語法
  • 數據驗證:通過 Pydantic 提供強大的數據驗證功能

安裝 FastAPI 非常簡單,只需運行以下命令:

pip install fastapi uvicorn

其中 Uvicorn 是一個支持 ASGI 的輕量級高性能 Web 服務器,是部署 FastAPI 應用的推薦選擇。

2. 基礎功能與代碼示例

2.1 創建基本 API 端點

FastAPI 最基本的功能是創建 API 端點。以下是一個簡單的 “Hello World” 示例:

from fastapi import FastAPIapp = FastAPI()@app.get("/")
async def read_root():return {"message": "Hello World"}@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):return {"item_id": item_id, "q": q}

代碼說明

  • app = FastAPI() 創建 FastAPI 實例
  • @app.get("/") 定義 GET 方法的路由
  • 路徑參數 item_id 會自動轉換為指定的類型(這里是 int)
  • 查詢參數 q 是可選的,默認值為 None

啟動服務:

uvicorn main:app --reload

訪問 http://127.0.0.1:8000/docs 可以看到自動生成的交互式 API 文檔。

2.2 請求體與 Pydantic 模型

FastAPI 使用 Pydantic 模型來定義請求體的數據結構:

from fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strprice: floatis_offer: bool = None@app.post("/items/{item_id}")
async def update_item(item_id: int, item: Item):return {"item_name": item.name, "item_id": item_id}

代碼說明

  • Item 類繼承自 BaseModel,定義了請求體的結構
  • 字段類型提示確保了輸入數據的類型安全
  • is_offer 是可選字段,默認值為 None
  • FastAPI 會自動驗證請求體是否符合模型定義

2.3 文件響應與下載

FastAPI 可以方便地實現文件下載功能:

import os
from fastapi import FastAPI
from starlette.responses import FileResponseapp = FastAPI()@app.get('/download/{filename}')
async def get_file(filename: str):path = os.path.join(os.getcwd(), filename)if not os.path.exists(path):return {"success": False, "msg": "文件不存在!"}return FileResponse(path)

代碼說明

  • FileResponse 用于返回文件內容
  • 安全性考慮:只允許下載已知文件名的文件
  • 可以進一步擴展為需要認證的文件下載服務

3. 高級功能與應用場景

3.1 用戶認證與 JWT

FastAPI 非常適合構建需要認證的 API 服務。以下是一個 JWT 認證示例:

from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
from jose import jwt
from pydantic import BaseModelapp = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")SECRET_KEY = "your-secret-key"
ALGORITHM = "HS256"class User(BaseModel):username: strpassword: strfake_users_db = {"johndoe": {"username": "johndoe","password": "secret"}
}@app.post("/token")
async def login(user: User):if user.username not in fake_users_db or fake_users_db[user.username]["password"] != user.password:raise HTTPException(status_code=400, detail="用戶名或密碼錯誤")token = jwt.encode({"sub": user.username}, SECRET_KEY, algorithm=ALGORITHM)return {"access_token": token, "token_type": "bearer"}@app.get("/users/me")
async def read_users_me(token: str = Depends(oauth2_scheme)):try:payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])username = payload.get("sub")return {"username": username}except:raise HTTPException(status_code=401, detail="無效的token")

代碼說明

  • 使用 OAuth2PasswordBearer 實現密碼流認證
  • JWT 用于生成和驗證令牌
  • /token 端點用于用戶登錄并獲取令牌
  • 受保護的路由通過 Depends 依賴令牌驗證

3.2 中間件與請求處理

FastAPI 支持中間件,可以在請求處理前后添加自定義邏輯:

from fastapi import FastAPI, Request
import timeapp = FastAPI()@app.middleware("http")
async def add_process_time_header(request: Request, call_next):start_time = time.time()response = await call_next(request)process_time = time.time() - start_timeresponse.headers["X-Process-Time"] = str(process_time)return response

代碼說明

  • 中間件可以訪問請求對象和返回響應
  • 示例中添加了處理時間的響應頭
  • 可用于日志記錄、認證、性能監控等場景

3.3 文件上傳

FastAPI 處理文件上傳非常簡單:

from fastapi import FastAPI, UploadFile, Fileapp = FastAPI()@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...)):return {"filename": file.filename}

代碼說明

  • UploadFile 類型處理文件上傳
  • 自動處理大文件,支持流式傳輸
  • 可以訪問文件名、內容類型等元數據

4. 實際應用場景

4.1 微服務架構

FastAPI 非常適合構建微服務。以下是一個微服務認證示例:

# auth_service.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from jose import jwtapp = FastAPI()
SECRET_KEY = "your-secret-key"
ALGORITHM = "HS256"class UserAuth(BaseModel):username: strpassword: str@app.post("/auth/login")
async def login(user: UserAuth):# 實際應用中應該查詢數據庫if user.username != "admin" or user.password != "secret":raise HTTPException(status_code=400, detail="用戶名或密碼錯誤")token = jwt.encode({"sub": user.username}, SECRET_KEY, algorithm=ALGORITHM)return {"token": token}

代碼說明

  • 認證服務獨立部署
  • 其他服務通過驗證 JWT 令牌來識別用戶
  • 適合分布式系統架構

4.2 數據庫集成

FastAPI 可以輕松集成各種數據庫。以下是 SQLAlchemy 集成示例:

from fastapi import FastAPI, Depends
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, SessionSQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()class User(Base):__tablename__ = "users"id = Column(Integer, primary_key=True, index=True)name = Column(String)email = Column(String, unique=True)Base.metadata.create_all(bind=engine)app = FastAPI()def get_db():db = SessionLocal()try:yield dbfinally:db.close()@app.post("/users/")
async def create_user(name: str, email: str, db: Session = Depends(get_db)):user = User(name=name, email=email)db.add(user)db.commit()db.refresh(user)return user

代碼說明

  • 使用 SQLAlchemy 作為 ORM
  • 依賴注入管理數據庫會話
  • 自動處理會話生命周期

4.3 機器學習模型部署

FastAPI 是部署機器學習模型的理想選擇:

from fastapi import FastAPI
from pydantic import BaseModel
import numpy as np
import joblibapp = FastAPI()
model = joblib.load("model.pkl")class PredictionInput(BaseModel):feature1: floatfeature2: float@app.post("/predict")
async def predict(input: PredictionInput):features = np.array([[input.feature1, input.feature2]])prediction = model.predict(features)return {"prediction": prediction.tolist()[0]}

代碼說明

  • 加載訓練好的模型
  • 定義輸入數據結構
  • 提供預測端點
  • 自動文檔幫助前端開發者了解 API 使用方法

5. 性能優化技巧

5.1 異步數據庫訪問

from fastapi import FastAPI
from databases import Databaseapp = FastAPI()
database = Database("sqlite:///./test.db")@app.on_event("startup")
async def startup():await database.connect()@app.on_event("shutdown")
async def shutdown():await database.disconnect()@app.get("/users/{user_id}")
async def read_user(user_id: int):query = "SELECT * FROM users WHERE id = :user_id"return await database.fetch_one(query=query, values={"user_id": user_id})

代碼說明

  • 使用異步數據庫驅動
  • 避免阻塞主線程
  • 提高并發處理能力

5.2 依賴緩存

from fastapi import FastAPI, Depends
from functools import lru_cacheapp = FastAPI()@lru_cache()
def get_settings():return {"setting1": "value1", "setting2": "value2"}@app.get("/settings")
async def read_settings(settings: dict = Depends(get_settings)):return settings

代碼說明

  • 使用 lru_cache 緩存依賴結果
  • 避免重復計算或查詢
  • 顯著提高性能

5.3 后臺任務

from fastapi import FastAPI, BackgroundTasks
import timeapp = FastAPI()def write_log(message: str):time.sleep(2)  # 模擬耗時操作with open("log.txt", mode="a") as log:log.write(message)@app.post("/send-notification/{message}")
async def send_notification(message: str, background_tasks: BackgroundTasks):background_tasks.add_task(write_log, message)return {"message": "Notification sent in the background"}

代碼說明

  • 使用 BackgroundTasks 處理耗時操作
  • 立即返回響應
  • 提高用戶體驗

6. 測試與調試

6.1 單元測試示例

from fastapi import FastAPI
from fastapi.testclient import TestClientapp = FastAPI()@app.get("/")
async def read_root():return {"message": "Hello World"}client = TestClient(app)def test_read_root():response = client.get("/")assert response.status_code == 200assert response.json() == {"message": "Hello World"}

代碼說明

  • 使用 TestClient 測試 API
  • 模擬 HTTP 請求
  • 驗證響應狀態碼和內容

6.2 調試中間件

from fastapi import FastAPI, Request
import loggingapp = FastAPI()
logging.basicConfig(level=logging.DEBUG)@app.middleware("http")
async def log_requests(request: Request, call_next):logging.debug(f"Request: {request.method} {request.url}")response = await call_next(request)logging.debug(f"Response: {response.status_code}")return response

代碼說明

  • 記錄請求和響應信息
  • 幫助調試 API 問題
  • 可擴展為完整的日志系統

7. 部署與生產環境

7.1 使用 Uvicorn 部署

uvicorn main:app --host 0.0.0.0 --port 80 --workers 4

參數說明

  • --host 0.0.0.0 允許外部訪問
  • --port 80 使用標準 HTTP 端口
  • --workers 4 啟動 4 個工作進程

7.2 Docker 部署

FROM python:3.9WORKDIR /app
COPY . /appRUN pip install fastapi uvicornCMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]

代碼說明

  • 創建輕量級 Docker 鏡像
  • 易于部署到各種環境
  • 支持容器編排系統

7.3 使用 Gunicorn 管理

gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app

參數說明

  • -w 4 4 個工作進程
  • -k uvicorn.workers.UvicornWorker 使用 Uvicorn worker
  • 提供更好的生產環境管理

8. 總結與最佳實踐

FastAPI 是一個功能強大且高效的 Python Web 框架,特別適合構建現代 API。通過本文的介紹,我們了解了它的核心功能和多種應用場景。以下是一些最佳實踐:

  1. 充分利用類型提示:類型提示不僅是文檔,還能提供編輯器支持和自動驗證

  2. 合理設計 API 結構:遵循 RESTful 原則,保持端點簡潔清晰

  3. 重視安全性:使用 HTTPS、認證中間件和輸入驗證

  4. 性能監控:添加日志和性能指標,及時發現瓶頸

  5. 文檔優先:利用自動生成的文檔,保持文檔與代碼同步

FastAPI 的學習曲線平緩,但功能強大,無論是小型項目還是大型微服務架構都能勝任。它的高性能特性使其成為 Python Web 開發的理想選擇,特別是在需要處理高并發的場景下。

隨著 Python 生態系統的不斷發展,FastAPI 正在成為構建 API 服務的首選框架。無論你是初學者還是經驗豐富的開發者,FastAPI 都值得加入你的技術棧。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73554.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73554.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73554.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【STM32】編寫程序控制開發板的RGB LED燈

目錄 1、原理圖2、文件結構3、使用寄存器模式點亮3.1、什么是寄存器3.2、寄存器開發的本質3.3、寄存器開發步驟3.4、主要源碼3.4.1、main.c3.4.2、drv_gpio.h3.4.3、drv_gpio.c3.4.4、使用BSRR和BRR影子寄存器優化drv_gpio.c3.4.5、效果演示 4、使用標準庫模式點亮4.1、使用標準…

MyBatis-Plus 的加載及初始化

在 Spring Boot 啟動過程中,MyBatis-Plus 的加載和初始化涉及多個階段的工作。這些工作包括 MyBatis-Plus 自身的配置解析、Mapper 接口的掃描與注冊、SQL 語句的動態注入以及底層 MyBatis 的初始化等。以下是對整個過程的詳細分析: 1. Spring Boot 啟動…

SpringBoot中安全的設置阿里云日志SLS的accessKey

眾所周知,阿里云的服務都是基于accesskeyId和accesskeySecret來進行身份鑒權的,但唯獨日志因為需要寫入到.xml文件里對于accesskeyId和accesskeySecret需要進行一定程度的改進,尤其是使用了jasypt進行加密的參數傳遞進去logback.xml更是會遇到需要對參數進行解密的問題,而官網只…

關于解決Ubuntu終端及系統字體大小的問題

在Ubuntu中調整終端和系統字體大小可以通過以下方法(可能不僅僅只是這幾種)實現: 1. 調整系統字體大小 打開終端并輸入以下命令,安裝GNOME Tweaks,等待安裝完成: sudo apt install gnome-tweaks 接著進行…

Rust vs. Go: 性能測試(2025)

本內容是對知名性能評測博主 Anton Putra Rust vs. Go (Golang): Performance 2025 內容的翻譯與整理, 有適當刪減, 相關數據和結論以原作結論為準。 再次對比 Rust 和 Go,但這次我們使用的是最具性能優勢的 HTTP 服務器庫---Hyper,它基于 Tokio 異步運…

【NLP 48、大語言模型的神秘力量 —— ICL:in context learning】

目錄 一、ICL的優勢 1.傳統做法 2.ICL做法 二、ICL的發展 三、ICL成因的兩種看法 1.meta learning 2.Bayesian Inference 四、ICL要點 ① 語言模型的規模 ② 提示詞prompt中提供的examples數量和順序 ③ 提示詞prompt的形式(format) 五、fine-tune VS I…

兩數之和解題記錄

開始打算用一個數組保存差值,arr[target-nums[i]] i, 只要arr[nums[i]]有內容就能滿足target,返回arr[nums[i]]和i。但是會出現復數的情況,所以換成map。 換成map就只用一邊遍歷,一遍檢查和存入對應key就行了,value就…

P1722 矩陣Ⅱ - 洛谷

題源:P1722 矩陣 II - 洛谷 看了題目之后,需要注意的是: ①在1 ~ i 個格子中紅色數量 > 黑色數量 ②最后,在2 * n 個格子中,紅色數量 黑色數量 根據這兩個約束條件,可以知道,第一個格…

數據庫——MySQL基礎操作

一、表結構與初始數據 假設存在以下兩張表: 1. student 表 字段名數據類型描述idINT學生唯一標識符nameVARCHAR(100)學生姓名ageINT學生年齡sexVARCHAR(10)學生性別 初始數據: idnameagesex1張三20男2李四22女3王五21男 2. course 表 字段名數據類…

行業白皮書2025 | 益企研究院:AI時代的存儲基石

在當今科技飛速發展的時代,AI技術已成為推動各行業變革的關鍵力量。日前,益企研究院重磅發布《AI時代的存儲基石》白皮書。 下載方式:關注“渡江客涂鴉板”,回復st250326獲取免費下載地址 數據需求與技術挑戰: AI技術…

音視頻新人如何快速上手nginx-rtmp-module

一、整體設計架構 nginx-rtmp-module 是 Nginx 的一個擴展模塊,專門為 Nginx 添加了對 RTMP 協議的支持。其核心功能包括: RTMP推流(publish) RTMP拉流(play) 流轉發(relay) 流錄…

vue 封裝 Axios菜鳥教程

1、Axios依賴下載 $ npm install axios 2、以下鏈接為Axios 的api Axios 實例 | Axios中文文檔 | Axios中文網 3、 項目新建request.js,文件名稱按照駝峰命名法就可以 4、封裝request.js代碼如下 import axios from "axios"//創建axios實例&#xff0…

[項目]基于FreeRTOS的STM32四軸飛行器: 十一.MPU6050配置與讀取

基于FreeRTOS的STM32四軸飛行器: 十一.MPU6050 一.芯片介紹二.配置I2C三.編寫驅動四.讀取任務的測試五.MPU6050六軸數據的校準 一.芯片介紹 芯片應該放置在PCB中間,X Y軸原點,敏感度131表示范圍越小越靈敏。理想狀態放置在地面上X,Y&#xf…

iOS常見網絡框架

URLSession、Alamofire 和 Moya 1. URLSession 1.1 核心概念 URLSession 是 Apple 官方提供的網絡請求 API,封裝在 Foundation 框架中。它支持 HTTP、HTTPS、FTP 等協議,可用于: ? ? 普通網絡請求(GET/POST) ? …

AOA(到達角度)與TOA(到達時間)兩個技術的混合定位,MATLAB例程,自適應基站數量,三維空間下的運動軌跡,濾波使用UKF(無跡卡爾曼濾波)

本文介紹一個MATLAB代碼,實現了三維動態目標非線性定位與濾波系統,通過融合 到達角(AOA) 和 到達時間(TOA) 的混合定位方法,結合 無跡卡爾曼濾波(UKF) 處理非線性觀測模型,優化軌跡精度。代碼支持自適應基站數量配置,適用于復雜非線性場景的定位研究。 文章目錄 運行…

Ubuntu 重置密碼方法

目錄 修改過 root 密碼,重置密碼的方法沒改過 root 密碼?,重置密碼的方法 修改過 root 密碼,重置密碼的方法 Ubuntu 默認禁用root用戶,意思就是安裝好Ubuntu系統后,root用戶默認是沒有密碼的,普通用戶通過…

Leetcode 路徑總和 III

java 解法一:雙遞歸 class Solution {public int pathSum(TreeNode root, long targetSum) { //外層遞歸,把每個節點都當作路徑起點if(root null) return 0;int ret rootSum(root, targetSum);ret pathSum(root.left, targetSum);ret pathSum(root.right, targ…

WEB安全--SQL注入--利用log寫入webshell

一、原理: 這也是對之前文章的補充:WEB安全--SQL注入--INTO OUTFILE-CSDN博客 我們可以通過修改MySQL的log文件,用select關鍵字寫入木馬文件放在服務器物理地址中,通過訪問物理地址getshell。 二、條件: 用戶有寫入權限…

C++11中引入的比較常用的新特性講解(上)

目錄 1、C11簡介 2、統一的列表初始化 2.1、{}初始化 2.2、std::initializer_list 3、變量類型推導 3.1、auto 3.2、decltype 3.3、nullptr 4、范圍for循環 5、STL中一些變化 6、右值引用和移動語義 6.1、左值引用和右值引用 6.2、右值引用…

hugo+github pages 部署實驗室網站

!!太爽了,看了很久教程,自己試了好久,終于搞懂怎么把hugo和public單獨進行部署了!!!!! 目的是什么?目的當然是為了修改這天殺的hugo的模板。現在…