高性能Python Web 框架--FastAPI 學習「基礎 → 進階 → 生產級」

????????以下是針對 FastAPI 的保姆級教程,包含核心概念、完整案例和關鍵注意事項,采用「基礎 → 進階 → 生產級」的三階段教學法:

一、FastAPI介紹

????????FastAPI 是一個現代化的、高性能的 Python Web 框架,專門用于構建 APIs(應用程序編程接口)。以下是它的核心特性和定位:

FastAPI 的本質

  1. 類型優先的框架:基于 Python 類型提示(Type Hints)

  2. 異步支持:原生兼容?async/await?語法

  3. 自動文檔生成:內置 OpenAPI(Swagger)和 JSON Schema 支持

  4. 高性能:媲美 NodeJS 和 Go 的速度(Starlette 底層)

優勢

FastAPI 核心優勢

  1. 性能卓越:基于 Starlette(異步)和 Pydantic(類型校驗)

  2. 開發效率:自動生成 Swagger/Redoc 文檔

  3. 類型安全:Python 類型注解驅動

  4. 異步支持:原生?async/await?支持

對比

特性FastAPIFlaskDjango
異步支持? 原生? 需擴展? 需擴展
自動 API 文檔? 內置? 需擴展? 需擴展
開發速度?? 極快🏎? 快🐢 中等
學習曲線📈 中等📉 低📈 高
性能🚀 最高🏎? 中等🚗 中等

核心組件架構?

典型應用場景

  1. 微服務架構:輕量級 API 服務

  2. 數據科學接口:機器學習模型部署

  3. 實時應用:WebSocket 支持

  4. 快速原型開發:即時 API 文檔


二、環境準備

# 創建虛擬環境(Python≥3.8)
python -m venv venv
source venv/bin/activate  # Linux/Mac
venv\Scripts\activate    # Windows# 安裝依賴
pip install "fastapi[all]" uvicorn

三、基礎案例:用戶管理系統

1. 項目結構

user_api/
├── main.py          # 主應用
├── models.py        # Pydantic 模型
└── database.py      # 模擬數據庫

2. 模型定義 (models.py)

from pydantic import BaseModel, EmailStrclass UserBase(BaseModel):email: EmailStrclass UserCreate(UserBase):password: strclass User(UserBase):id: intis_active: boolclass Config:from_attributes = True  # 替換原來的 orm_mode

3. 數據庫模擬 (database.py)

from typing import Dict
fake_db: Dict[int, User] = {}class UserCRUD:@staticmethoddef create(user: UserCreate) -> User:user_id = len(fake_db) + 1db_user = User(id=user_id, email=user.email, is_active=True)fake_db[user_id] = db_userreturn db_user

4. 主應用 (main.py)

from fastapi import FastAPI, HTTPException
from models import User, UserCreate
from database import UserCRUDapp = FastAPI()@app.post("/users/", response_model=User)
async def create_user(user: UserCreate):return UserCRUD.create(user)@app.get("/users/{user_id}", response_model=User)
async def read_user(user_id: int):if user_id not in fake_db:raise HTTPException(status_code=404, detail="User not found")return fake_db[user_id]

5. 啟動與測試?

uvicorn main:app --reload
  • 訪問?http://127.0.0.1:8000/docs?查看交互文檔

  • 測試請求:

    curl -X POST "http://127.0.0.1:8000/users/" \
    -H "Content-Type: application/json" \
    -d '{"email":"user@example.com","password":"secret"}'
  • 注意:若項目結構非上述結構,啟動需進入到對應文件目錄執行。如圖:

    四、進階功能

    1. 依賴注入

    from fastapi import Dependsdef get_db():db = fake_db  # 模擬數據庫連接try:yield dbfinally:pass  # 實際場景關閉連接@app.get("/items/")
    async def read_items(db: dict = Depends(get_db)):return db

    2. 異步數據庫

    from sqlalchemy.ext.asyncio import AsyncSession@app.post("/async-users/")
    async def create_async_user(user: UserCreate, db: AsyncSession = Depends(get_async_db)
    ):# 使用 asyncpg 或 aiomysql 等pass

    3. 中間件

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

    五、生產級注意事項

    1. 安全加固

    from fastapi.security import OAuth2PasswordBeareroauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")@app.get("/secure/")
    async def secure_endpoint(token: str = Depends(oauth2_scheme)):return {"token": token}

    2. 配置管理

    from pydantic_settings import BaseSettingsclass Settings(BaseSettings):app_name: str = "User API"admin_email: stritems_per_page: int = 50class Config:env_file = ".env"

    3. 日志監控

    import logging
    from fastapi.logger import loggerlogging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    )
    logger = logging.getLogger(__name__)

    六、性能優化技巧

  • 路由注冊順序:高頻路由放前面

  • 響應模型優化

    @app.get("/users/", response_model=List[User])
    async def read_users(limit: int = 100):  # 分頁限制return list(fake_db.values())[:limit]
  • 靜態文件緩存

    from fastapi.staticfiles import StaticFiles
    app.mount("/static", StaticFiles(directory="static"), name="static")

    七、常見錯誤解決方案

    錯誤類型解決方法
    422 Validation Error檢查請求體是否符合 Pydantic 模型
    ImportError: cannot import name 'UploadFile'升級 fastapi 版本
    異步函數忘記加?await使用?@router.get()?替代?@app.get()?時需注意

    八、完整項目示例

    推薦學習官方示例庫:

    git clone https://github.com/tiangolo/fastapi-examples

    通過這個教程,您已經掌握了從開發到部署 FastAPI 的全流程。建議下一步:

  • 集成 Redis 緩存

  • 學習 APIFlask 比較異同

  • 研究 OpenAPI 擴展規范

九、學習路徑建議

  1. 初級階段:掌握路由、Pydantic 模型

  2. 中級階段:依賴注入、中間件

  3. 高級階段:自定義 APIRoute、背景任務

  4. 專家階段:ASGI 生命周期鉤子、測試策略

FastAPI 的官方文檔(https://fastapi.tiangolo.com)提供了最權威的指南,推薦結合實踐項目逐步深入。對于已有?Flask/Django 經驗的開發者,通常可在 2-3 天內完成轉型。

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

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

相關文章

H2 Database Select 語句執行流程

H2 Database Select 語句執行流程 使用 // CREATE TABLE IF NOT EXISTS test(id INT primary key, name VARCHAR(255)) // insert into test(id, name) values(1, name1), (2, name2), (3, name3), (4, name4); String sql "SELECT * FROM test where id > 1 and na…

理解 Envoy 的架構

理解 Envoy 的架構對于深入理解 Istio 至關重要,因為 Envoy 是 Istio 數據平面的核心。Envoy 是一個高性能的 C 分布式代理,設計為云原生應用和大規模微服務架構的網絡基礎。 以下是 Envoy 架構的關鍵組成部分和核心理念: 核心設計理念&…

Android開發-常用布局

在Android應用開發中,布局決定了用戶界面的結構和元素之間的相對位置。選擇合適的布局不僅能夠提升用戶體驗,還能提高代碼的可維護性和靈活性。本文將介紹幾種最常用的Android布局方式,包括LinearLayout、RelativeLayout、ConstraintLayout以…

如何在MySQL中實現類似Redis的PING命令的功能來檢測連接狀態?

要在MySQL中實現類似Redis的PING命令的功能來檢測連接狀態,可以采用以下方法: 方法一:使用簡單的SQL查詢 最直接的方法是通過執行一個簡單的查詢來檢測連接狀態,例如: SELECT 1;如果查詢成功并返回結果(…

Vue 系列之:defineProps、defineEmits、...

defineProps 用于接收父組件傳遞的屬性值。 父組件&#xff1a; <!-- 父組件 --> <template><Child1 str"字符串" :num"num" />-----------------<Child2 str"字符串" :num"num" /> </template><…

windows服務器部署Gitlab

代碼托管,如果對工具功能要求不高,Gitea也可以滿足需要,只是功能相對比較簡單。 通常GltLab是部署在linux服務器上的,windows版本已經不維護了。不過現在windows10 11已經可以實現部署了,一個是windows本機部署linux虛擬機(windows商店直接安裝或者其他虛擬機平臺都可以)…

剖析 FFmpeg:從基本功能到過濾器,實現音視頻處理的靈活性

目錄 1.解復用2 解碼2.1 音頻解碼2.2 視頻解碼 3 修飾3.1 avio3.2 重采樣 4 過濾器4.1 過濾器基本知識4.2 簡單過濾器4.3 復雜濾鏡圖 1.解復用 解復用就是把容器中的媒體流分離出來&#xff0c;方便我們對媒體流處理。 step1&#xff1a;對媒體文件上下文初始化 AVFormatCont…

kafka學習筆記(四、生產者、消費者(客戶端)深入研究(三)——事務詳解及代碼實例)

1.事務簡介 Kafka事務是Apache Kafka在流處理場景中實現Exactly-Once語義的核心機制。它允許生產者在跨多個分區和主題的操作中&#xff0c;以原子性&#xff08;Atomicity&#xff09;的方式提交或回滾消息&#xff0c;確保數據處理的最終一致性。例如&#xff0c;在流處理中…

Missashe計網復習筆記(隨時更新)

Missashe計算機網絡復習筆記 前言&#xff1a;這篇筆記用于博主對計網這門課所學進行記錄和總結&#xff0c;也包括一些個人的理解。正在更新當中…… 第一章 計算機網絡體系結構 考綱內容 (一) 計算機網絡概述 計算機網絡的概念、組成與功能;計算機網絡的分類; 計算機網絡…

PVP鼠標推薦(deepseek)

下面有不懂的自行百度查找&#x1f44d; ?? 以下是幾款在 雙擊性能&#xff08;DBC&#xff09; 和 拖拽點擊&#xff08;DC&#xff09; 方面表現優秀的游戲鼠標推薦&#xff0c;結合了硬件性能、微動壽命以及玩家口碑&#xff1a; 1. 羅技 G102/G203 Lightsync 特點&#…

ABP vNext + EF Core 實戰性能調優指南

ABP vNext EF Core 實戰性能調優指南 &#x1f680; 目標 本文面向中大型 ABP vNext 項目&#xff0c;圍繞查詢性能、事務隔離、批量操作、緩存與診斷&#xff0c;系統性地給出優化策略和最佳實踐&#xff0c;幫助讀者快速定位性能瓶頸并落地改進。 &#x1f4d1; 目錄 ABP vN…

為啥大模型一般將kv進行緩存,而q不需要

1. 自回歸生成的特點 大模型&#xff08;如 GPT 等&#xff09;在推理時通常采用自回歸生成的方式&#xff1a; 模型逐個生成 token&#xff0c;每次生成一個新 token 時&#xff0c;需要重新計算注意力。在生成第 t 個 token 時&#xff0c;模型需要基于前 t-1 個已生成的 t…

3DGS-slam:splatam公式

配套講解視頻&#xff1a;https://www.bilibili.com/video/BV1ZgfBYdEpg/?spm_id_from333.1387.homepage.video_card.click&vd_sourced4c3e747c32049ddd90dcce17208f4e0 1、多維高斯分布公式: 對于多維&#xff08;多變量&#xff09;高斯分布&#xff0c;概率密度函數的…

從Dockerfile 構建docker鏡像——保姆級教程

從Dockfile開始 dockerfile簡介開始構建1、編輯dockerfile2、構建鏡像3、拉取鏡像4、推送到鏡像倉庫 鏡像的優化1、優化的基本原則2、多階段構建 dockerfile簡介 開始構建 1、編輯dockerfile # 使用官方的 Python 3.8 鏡像作為基礎鏡像 FROM python:3.8-slim# 設置工作目錄 …

開元類雙端互動組件部署實戰全流程教程(第2部分:控制端協議拆解與機器人邏輯調試)

作者&#xff1a;那個寫了個機器人結果自己被踢出房間的開發者 游戲邏輯房間結構參考界面 從這張圖我們能看出&#xff0c;該組件按功能結構細分為多個房間&#xff0c;每個房間底注、準入標準不同&#xff0c;對應的控制模塊也有層級區分。常規來說&#xff0c;一個“互動房間…

[特征工程]機器學習-part2

1 特征工程概念 特征工程:就是對特征進行相關的處理 一般使用pandas來進行數據清洗和數據處理、使用sklearn來進行特征工程 特征工程是將任意數據(如文本或圖像)轉換為可用于機器學習的數字特征,比如:字典特征提取(特征離散化)、文本特征提取、圖像特征提取。 特征工程步驟…

[數據庫之十一] 數據庫索引之聯合索引

執行數據庫查詢時&#xff0c;通常查詢條件是多對個屬性進行判斷和約束&#xff0c;對于這種類型的查詢&#xff0c;如果存在多個索引則使用多個索引&#xff0c;或者使用建立在多屬性搜索碼上的索引&#xff0c;這樣能提高查詢效率。 一、使用多個單碼索引 假設數據表 instruc…

增強學習(Reinforcement Learning)簡介

增強學習&#xff08;Reinforcement Learning&#xff09;簡介 增強學習是機器學習的一種范式&#xff0c;其核心目標是讓智能體&#xff08;Agent&#xff09;通過與環境的交互&#xff0c;基于試錯機制和延遲獎勵反饋&#xff0c;學習如何選擇最優動作以最大化長期累積回報。…

PaddlePaddle 和PyTorch選擇與對比互斥

你遇到的錯誤信息如下&#xff1a; RuntimeError: (PreconditionNotMet) Tensors dimension is out of bound.Tensors dimension must be equal or less than the size of its memory.But received Tensors dimension is 8, memorys size is 0.[Hint: Expected numel() * Size…

vison transformer vit 論文閱讀

An Image is Worth 16x16 Words 20年的論文看成10年的哈斯我了 [2010.11929] 一張圖像勝過 16x16 個單詞&#xff1a;用于大規模圖像識別的轉換器 --- [2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 為什么transformer好訓練&am…