国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

FastAPI 實戰秘籍:從零構建高性能 API-依賴注入

開發
依賴注入是 FastAPI? 的核心特性之一,大地降低了代碼耦合度,使業務邏輯更清晰、獨立。

FastAPI 中,依賴注入是其核心特性與強大優勢。它并非復雜的設計模式,而是通過簡潔的 Depends()  函數,將路徑操作函數的共性需求(如數據庫會話、用戶認證、權限檢查)抽象為可復用的“依賴項”。開發者聲明函數所需的依賴,FastAPI 框架便會自動創建、注入并管理這些組件。

一、依賴注入基礎概念

1. 什么是依賴注入?

依賴注入是一種設計模式,用于實現控制反轉(IoC),讓類從外部接收依賴對象,而不是自己創建。

定義拆解:

  • 依賴:當一個類A需要另一個類B才能正常工作時,我們就說A依賴于B。B就是A的依賴。
  • 例如,一輛Car(汽車)需要一個Engine(引擎)才能運行。Car 依賴于 Engine。
  • 注入:不是由Car自己在內部new Engine(),而是通過構造函數、方法或屬性,從外部將已經創建好的Engine對象“注入”或“傳遞”給Car。

所以,依賴注入的直白翻譯就是:“把依賴從外部注入進去”。

2. FastAPI 依賴注入

在 FastAPI 中,依賴注入是它的一個核心特性,使用起來非常簡單。

「定義一個依賴」任何可調用對象(如函數)都可以作為依賴。通常我們使用普通函數。

from fastapi import Depends, FastAPI

app = FastAPI()

# 1. 這是一個依賴函數
async def common_parameters(q: str = None, skip: int = 0, limit: int = 100):
    # 它可能包含一些共享邏輯,比如數據庫會話、身份驗證等
    return {"q": q, "skip": skip, "limit": limit}

「在路徑操作中使用依賴」使用 Depends 來聲明一個參數來自于依賴注入。

# 2. 在路徑操作函數中聲明依賴
@app.get("/items")
async def read_items(commons: dict = Depends(common_parameters)):
    # FastAPI 會調用 common_parameters 函數,將其返回值注入到 `commons` 參數中
    return commons

執行步驟:

  • 執行訪問/items
  • 發現read_items函數, 函數傳遞了參數commons
  • 參數commons通過Depends聲明
  • 執行 common_parameters 依賴函數,獲取其返回值。
  • 將這個返回值傳遞給 read_items 函數的 commons 參數。

3. 依賴注入的優勢

  • 代碼復用:共享業務邏輯
  • 參數驗證:自動處理請求數據驗證
  • 依賴管理:管理數據庫連接、認證等
  • 測試友好:易于模擬依賴進行測試

二、基礎依賴使用

1. 簡單依賴函數

from fastapi import FastAPI, Depends

app = FastAPI()

# 基礎依賴函數
def common_parameters():
    return {"message": "This is common data"}

@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
    return commons

直接返回的是common_paramsters的函數的執行結果。

2. 多依賴項

async def verify_token(x_token: str = Header(...)):
    if x_token != "fake-super-secret-token":
        raise HTTPException(status_code=400, detail="X-Token header invalid")
    return x_token  # 這個返回值不會被傳遞到 read_items

asyncdef verify_key(x_key: str = Header(...)):
    if x_key != "fake-super-secret-key":
        raise HTTPException(status_code=400, detail="X-Key header invalid")
    return x_key  # 這個返回值不會被傳遞到 read_items

@app.get("/items/", dependencies=[Depends(verify_token), Depends(verify_key)])
asyncdef read_items():
    # 這里無法訪問 verify_token 和 verify_key 的返回值
    return [{"item": "Foo"}, {"item": "Bar"}]

當使用 dependencies 參數添加多個依賴項時,這些依賴項的返回值不會被注入到路徑操作函數中。它們主要用于執行驗證、副作用等操作,而不需要將返回值傳遞給主函數。

3. 類依賴示例

from typing import Optional

class CommonQueryParams:
    def __init__(self, q: Optional[str] = None, skip: int = 0, limit: int = 100):
        self.q = q
        self.skip = skip
        self.limit = limit

@app.get("/items/")
asyncdef read_items(commons: CommonQueryParams = Depends(CommonQueryParams)):
    response = {}
    if commons.q:
        response.update({"q": commons.q})
    items = [{"item_id": "Foo"}, {"item_id": "Bar"}]
    response.update({"items": items[commons.skip : commons.skip + commons.limit]})
    return response

類依賴項依賴注入后,在主函數中使用會直接實例化對象。

4. 可配置的類依賴

# 連接數據庫
engine = create_engine(
    url="mysql+pymysql://root:123456@127.0.0.1:3306/zadmin",
    echo=True,
    pool_size=20
)

# 數據庫會話
session_local = sessionmaker(
    autocommit=False,
    autoflush=False,
    bind=engine)

# 依賴函數
def get_db():
    with session_local() as session:
        yield session

@app.post("/users", name="獲取用戶信息")
def api_list(db: Session = Depends(get_db)):
    # 查詢所有用戶信息
    return db.query(User).all()

現在自動注入數據庫會話,能夠在主函數中進行數據的crud操作了。

三、常用應用場景

在Fastapi中,我們常用依賴注入做基礎的身份檢查、權限檢查,緩存處理, 接口限流等操作。

1. 身份認證

def get_current_user(
        token: str = Depends(oauth2_scheme),
        db: Session = Depends(get_db)
):
    credentials_exception = HTTPException(
        status_code=status.HTTP_401_UNAUTHORIZED,
        detail="需要身份認證",
        headers={"WWW-Authenticate": "Bearer"},
    )
    try:
        payload = jwt.decode(token, settings.jwt.secret_key, algorithms=[settings.jwt.algorithm])
        uid: str = payload.get("id")
        if uid isNone:
            raise credentials_exception
    except jwt.InvalidTokenError:
        raise credentials_exception

    user = db.query(User).get(uid)

    if user isNone:
        raise credentials_exception
    return user

@app.post("/user/me", name="當前登錄用戶")
def api_list(db: Session = Depends(get_db), u:User = Depends(get_current_user)):
    return u

現在訪問接口/user/me, 需要用戶登錄后才能訪問。

2. 用戶權限檢查

def get_permission(required_permission: str):
    """
    權限檢查依賴項工廠函數
    """
    def check_user_permission(current_user: User = Depends(get_current_user)) -> User:
        if required_permission notin current_user.permissions:
            raise HTTPException(
                status_code=status.HTTP_403_FORBIDDEN,
                detail=f"Require {required_permission} permission to access this resource"
            )
        return current_user
    return check_user_permission

@app.post("/menus", name="菜單列表")
def api_list(db: Session = Depends(get_db), 
             u:User = Depends(get_permssion("system.menu.list")),
             ):
    # 當前登錄用戶
    return u

我們很多項目都有各種角色用戶,每個角色權限不同。我們可以在每個接口增加訪問權限控制。 上面我們依賴的是get_permssion("system.menu.list"),它返回的是check_user_permission的函數執行結果。

四、總結

FastAPI 的依賴注入系統提供了強大而靈活的方式來管理應用程序的依賴關系。關鍵要點:

  • 代碼復用:通過依賴共享通用邏輯
  • 測試友好:易于模擬和替換依賴
  • 類型安全:充分利用 Python 類型提示
  • 靈活組合:可以創建復雜的依賴鏈
  • 生命周期管理:支持同步和異步依賴

依賴注入是 FastAPI 的核心特性之一,大地降低了代碼耦合度,使業務邏輯更清晰、獨立。它同時帶來了卓越的可測試性,便于在單元測試中輕松替換模擬依賴。通過依賴注入,FastAPI 引導開發者構建出高度模塊化、易于維護和測試的現代化 API 應用,簡化了開發流程。

責任編輯:趙寧寧 來源: 程序員老朱
相關推薦

2025-09-08 11:00:00

2025-12-02 09:14:18

FastAPIweb開發

2025-12-03 06:35:00

FastAPI中間件開發

2025-09-08 06:10:00

FastAPI開發web

2025-09-09 07:00:00

數據庫FastAPI開發

2025-06-03 08:15:00

微服務架構異步任務隊列

2017-07-11 15:26:57

LocalMQ RocketMQ高性能

2023-11-06 08:32:17

FastAPIPython

2025-12-03 06:20:00

FastAPI代碼Python

2025-04-10 08:10:00

Web 框架FastAPIPython

2021-10-14 09:51:17

架構運維技術

2025-05-26 09:25:00

Web 接口開發Redis

2025-04-07 05:00:00

2025-01-13 12:23:51

2024-11-25 09:10:03

2011-10-25 13:13:35

HPC高性能計算Platform

2011-10-21 14:20:59

高性能計算HPC虛擬化

2022-12-09 08:40:56

高性能內存隊列

2017-08-16 11:00:38

TCPIP協議

2018-03-30 18:17:10

MySQLLinux
點贊
收藏

51CTO技術棧公眾號

97色在线视频观看| 分分操这里只有精品| 欧美日韩一区在线| 91亚洲精品久久久久久久久久久久| 波多野在线观看| 亚洲欧洲色图综合| 天堂а√在线中文在线| 国产91久久精品一区二区| 国产亚洲欧美日韩一区二区| wwwww在线观看免费视频| 亚洲欧洲色图综合| 浮妇高潮喷白浆视频| 亚洲一区不卡| 成人字幕网zmw| 亚洲天堂中文字幕在线观看| 日韩成人激情在线| 国产激情在线| 色综合久久久久综合99| 国产又大又黄又猛| 99国产麻豆精品| 亚洲欧洲日韩综合二区| 亚洲国内精品| 91天堂在线视频| 欧美日韩伦理在线免费| 成年无码av片在线| 精品九九久久| 亚洲欧美www| 欧美xxxx黑人又粗又长| 欧美婷婷六月丁香综合色| 天海翼一区二区三区四区在线观看| 久久综合成人精品亚洲另类欧美| 吴梦梦av在线| 狠狠色2019综合网| 一区二区精品在线| 欧美中文字幕视频| av自拍一区| 九九热精品在线| 国产亚洲精品精品国产亚洲综合| 日韩精品高清在线| 美女扒开腿让男人桶爽久久软| 欧美三片在线视频观看| 一级毛片在线看| 粉嫩av一区二区三区免费野| 自拍av在线| 污片在线观看一区二区| 永久免费不卡在线观看黄网站| 亚洲日本韩国一区| www污污在线| 色综合亚洲欧洲| 美国一级片在线免费观看视频| 欧美色videos| www.久久热.com| 日韩久久免费av| 国产精品论坛| 日韩中文字幕网站| 加勒比色综合久久久久久久久| 97成人在线视频| 日韩精品电影| 乱色588欧美| 黑人巨大精品欧美黑白配亚洲| 男女啪啪免费观看| 日本一区二区成人在线| 日本中文字幕高清视频| 精品久久久一区| 黄色网址在线免费播放| 亚洲成年人影院在线| 久久91视频| 日韩欧美视频在线播放| 欧美精品免费看| 欧美猛男男男激情videos| 99一区二区| 国产一区二区中文字幕| 日本www高清视频| 五月天网站亚洲| 在线免费观看a视频| 色七七影院综合| 欧洲grand老妇人| 天堂资源在线亚洲视频| 99热99精品| 四虎精品成人影院观看地址| 日韩精品资源二区在线| 看亚洲a级一级毛片| 亚洲精品免费一区二区三区| 首页综合国产亚洲丝袜| 99免费视频观看| 欧美专区日韩专区| 中文日产幕无线码一区二区| 欧美激情在线播放| 66久久国产| wwwwww欧美| 色综合色综合色综合色综合色综合 | 97精品资源在线观看| 日本精品性网站在线观看| 在线亚洲观看| 无码无遮挡又大又爽又黄的视频| 午夜视频久久久久久| 国产盗摄精品一区二区酒店| 午夜精品久久久久久久男人的天堂 | av网站在线免费观看| 亚洲视频第一页| 国产午夜一区| 8x8x华人在线| 欧美日韩午夜视频在线观看| 都市激情亚洲综合| 91免费观看网站| 久久久精品综合| 免费在线国产视频| 日本最新高清不卡中文字幕| 久久国产视频网| 日韩大胆视频| 精品久久久av| 美女视频一区免费观看| 羞羞免费视频| 中文字幕精品网| 久久大逼视频| 在线播放网站| 欧美精品18videos性欧| 久久成人综合网| 超碰免费在线| 国产日韩欧美在线| 亚洲欧洲日韩av| 婷婷激情成人| 中文字幕色一区二区| 91成人免费电影| av亚洲免费| 成人图片小说| 久久精品国产精品| 亚洲va码欧洲m码| 国产精品家庭影院| 国产精品原创视频| 日本一区视频在线播放| 精品久久久久久中文字幕大豆网| a级日韩大片| 欧美日韩二三区| 亚洲欧洲高清在线| 日韩高清一级片| av在线免费一区| 亚洲一区二区三区777| 伊人色综合久久天天人手人婷| 3d动漫一区二区三区在线观看| 制服丝袜综合日韩欧美| 91精品综合久久久久久| 国产精品www994| 欧美成人片在线| 91亚洲国产成人久久精品网站| 一区二区三区精品在线| 青青草这里只有精品| 冲田杏梨av在线| 欧美精品videos性欧美| 久久久亚洲欧洲日产国码αv| 精品美女一区| 国产精品99久久免费黑人人妻| 国产亚洲精品久久久久久777 | 欧美激情喷水视频| 91丨九色丨尤物| 国产精品亚洲一区二区在线观看| 天天做天天躁天天躁| 亚洲视频第一页| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 国产精品ⅴa有声小说| 国产精品美乳在线观看| 综合激情成人伊人| 日韩欧美影院| 欧美5-7sexvideos处| 91精品国产综合久久男男 | 国产精品福利在线| 亚洲国产欧美在线人成| 国产欧美一区二区精品久久久| 米奇.777.com| 91最新在线免费观看| 色综合天天性综合| 小嫩嫩精品导航| 毛片电影在线| 黄色影院一级片| 97激碰免费视频| 亚洲成人黄色影院| 欧美另类视频| 日本在线视频www鲁啊鲁| 91免费网站视频| 美女福利视频一区| 亚洲欧美另类在线| 无需播放器亚洲| 久草资源在线| 日韩一级片一区二区| 久久夜色精品国产欧美乱| 亚洲视频在线观看一区| 欧美激情欧美| 最新日本在线观看| av免费在线播放网站| 国产欧美日韩精品专区| 日韩欧美国产小视频| 99久久免费国产| 国产一区二区三区探花| 亚洲成人影院麻豆| 欧美极品欧美精品欧美| 国产精品高潮呻吟久久av黑人| 人人澡人一摸人人添| 99re在线| 国产小视频国产精品| 亚洲福利视频一区|