」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > FastAPI:如何使用 Pydantic 宣告查詢參數

FastAPI:如何使用 Pydantic 宣告查詢參數

發佈於2024-11-19
瀏覽:802

它大約三週前發布,是 FastAPI 最受期待的功能之一。至少當我們談論 Pydantic Models FastAPI 時。

是的,我說的是使用 Pydantic 模型來繪製查詢參數的能力。

所以在這篇文章中,我將盡力向您展示一切?可以和?無法解決這個問題? :

?映射查詢參數

要開始使用 Pydantic 映射查詢參數,您需要做的第一件事是確保您使用的是 FastAPI 版本 0.115.0。

此後,您可以隨時存取 FastAPI 文件來檢查已有的內容。 Sebastián 和團隊成員在保持文件更新和資訊豐富方面做得非常非常出色 ✨。

?一點點歷史

讓我們從一些範例開始,了解如何在 FastAPI 中對應查詢參數。 ?

最簡單的方法是:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def search(
    limit: int | None = 10,
    skip: int | None = 1,
    filter: str | None = None
):
    return {
        "limit": limit,
        "skip": skip,
        "filter": filter
    }

現在您只需呼叫:

GET http://localhost:8000/?limit=42&skip=12&filter=banana

但是,如果我們確定此查詢參數將在其他路由中使用,我們將使用以下內容隔離它:

from typing import Any
from fastapi import Depends, FastAPI, Query

app = FastAPI()

async def pagination_query_string(
    limit: int | None = Query(10, ge=5, le=100),
    skip: int | None = Query(1, ge=1),
    filter: str | None = Query(None)
) -> dict[str, Any]:
    return {
        "limit": limit,
        "skip": skip,
        "filter": filter
    }

@app.get("/")
async def search(q: dict[str, Any] = Depends(pagination_query_string)):
    return q

或因為我們使用 Pydantic 來繪製我們的模型,只需一點重構,我們就會得到:

from fastapi import Depends, FastAPI, Query
from pydantic import BaseModel

app = FastAPI()

class PaginationQueryString(BaseModel):
    limit: int | None = 10
    skip: int | None = 1
    filter: str | None = None

async def pagination_query_string(
    limit: int | None = Query(10, ge=5, le=100),
    skip: int | None = Query(1, ge=1),
    filter: str | None = Query(None)
) -> PaginationQueryString:
    return PaginationQueryString(
        limit=limit,
        skip=skip,
        filter=filter
    )

@app.get("/")
async def search(q: PaginationQueryString = Depends(pagination_query_string)):
    return q

⌨️ 使用 Pydantic 映射查詢字串

FastAPI: How to use Pydantic to declare Query Parameters

現在,如果我們想要取得查詢字串,我們不需要建立一個函數,然後將其新增為依賴項。我們可以簡單地告訴 FastAPI 我們想要一個 PaginationQueryString 類型的對象,並且它是一個查詢字串:

from typing import Annotated
from fastapi import FastAPI, Query
from pydantic import BaseModel

app = FastAPI()

class PaginationQueryString(BaseModel):
    limit: int | None = 10
    skip: int | None = 1
    filter: str | None = None

@app.get("/")
async def search(q: Annotated[PaginationQueryString, Query()]):
    return q

簡單吧? ?

⚠️有什麼限制?

至少在 0.115.0 版本中,它不能很好地處理嵌套模型。

讓我們試試看:

from typing import Annotated
from fastapi import FastAPI, Query
from pydantic import BaseModel

app = FastAPI()

class Filter(BaseModel):
    name: str | None = None
    age: int | None = None
    nickname: str | None = None

class PaginationQueryString(BaseModel):
    limit: int | None = 10
    skip: int | None = 1
    filter: Filter | None = None

@app.get("/")
async def search(q: Annotated[PaginationQueryString, Query()]):
    return q

如果我們像以前那樣稱呼它:

GET http://localhost:8000/?limit=42&skip=12&filter=chocolate

我們會收到一個錯誤,告訴我們過濾器是一個物件:

{
    "detail": [
        {
            "type": "model_attributes_type",
            "loc": [
                "query",
                "filter"
            ],
            "msg": "Input should be a valid dictionary or object to extract fields from",
            "input": "chocolate"
        }
    ]
}

至少現在來說,是絕對正確的!我們將過濾器更改為 Pydantic 模型,而不是字串。但如果我們嘗試將其轉換為字典:

http://localhost:8000/?limit=42&skip=12&filter={"name": "Rafael", "age": 38, "nickname": "ceb10n"}

FastAPI 會告訴我們過濾器需要是一個有效的字典? :

{
    "detail": [
        {
            "type": "model_attributes_type",
            "loc": [
                "query",
                "filter"
            ],
            "msg": "Input should be a valid dictionary or object to extract fields from",
            "input": "{\"name\": \"Rafael\", \"age\": 38, \"nickname\": \"ceb10n\"}"
        }
    ]
}

發生這種情況是因為 FastAPI 將依賴 Starlette 的 QueryParams,它將向 FastAPI 提供一個字串,而不是一個字典。至少在 0.115.0 版本中,這會給你一個錯誤。

⁉️ 那麼,我什麼時候應該在查詢參數中使用 Pydantic 模型?

這很簡單:

✅ 您有簡單的查詢字串,不需要任何複雜的花俏的嵌套物件?使用它! ?

❌ 您建立了一個複雜的嵌套查詢字串?還沒用過嗎? (也許您應該嘗試重新考慮您的查詢字串。?越簡單越好?)

版本聲明 本文轉載於:https://dev.to/ceb10n/fastapi-how-to-use-pydantic-to-declare-query-parameters-25bd?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何重載好友運算子 `
    如何重載好友運算子 `
    重載範本類別的友元運算子
    程式設計 發佈於2024-11-19
  • 為什麼 Goroutine 在 Windows 上有時會執行失敗?
    為什麼 Goroutine 在 Windows 上有時會執行失敗?
    理解 Windows 上非功能性 Goroutines 之謎在並發領域,Goroutines 在 Go 中充當輕量級線程。然而,一些程式設計師遇到了意想不到的挑戰:goroutines 無法在 Windows 上執行。為了解開這個謎團,讓我們深入研究根本問題。 根本原因:非同步執行與傳統執行緒不同,...
    程式設計 發佈於2024-11-19
  • ## JavaScript 可以偵測瀏覽器歷史記錄的可用性嗎?
    ## JavaScript 可以偵測瀏覽器歷史記錄的可用性嗎?
    如何偵測瀏覽器歷史記錄可用性確定瀏覽器中的後退按鈕是否可用是 Web 開發過程中常見的問題。然而,需要注意的是,使用 JavaScript 直接檢查瀏覽器歷史記錄通常是不可能實現的。 技術方法:history.previous技術上,一種方法是利用History.previous 屬性。該屬性應該指...
    程式設計 發佈於2024-11-19
  • 如何新增查詢字串來取得 GET 請求?
    如何新增查詢字串來取得 GET 請求?
    使用 Fetch GET 請求的查詢字串Fetch API 提供了一種在 JavaScript 中發出 HTTP 請求的現代方法。預設情況下,使用 Fetch 發出的 GET 請求不包含查詢字串參數。要將查詢字串新增至 GET 請求,我們可以使用 URLSearchParams 介面或手動連接查詢字...
    程式設計 發佈於2024-11-19
  • 為什麼在選擇子集時應該始終複製 Pandas DataFrame?
    為什麼在選擇子集時應該始終複製 Pandas DataFrame?
    了解Pandas 中資料幀複製的重要性在Pandas 中,選擇資料幀的一部分時,通常的做法是使用'.copy() ' 方法建立原始資料幀的副本。此方法可確保子集所做的任何變更都不會影響父資料框。 為什麼要複製? 預設情況下,索引資料框會傳回原始資料框的視圖,而不是副本。這意味著對子集...
    程式設計 發佈於2024-11-19
  • 為什麼在 C++ 中 `std::remove` 會重新排列元素而不是刪除它們?
    為什麼在 C++ 中 `std::remove` 會重新排列元素而不是刪除它們?
    理解差異:擦除與刪除在C 程式設計領域,std::erase 和std::remove 是兩個在修改容器時,不同的功能有不同的用途。雖然這兩個函數都可用於從容器中刪除元素,但它們的行為有所不同。 Std::remove:重新排列元素與刪除Std::刪除是一種對一系列元素進行操作並在容器內重新排列它們...
    程式設計 發佈於2024-11-19
  • 我可以依靠 PHP 的「php.ini」精度來進行準確的資金計算嗎?
    我可以依靠 PHP 的「php.ini」精度來進行準確的資金計算嗎?
    我可以依靠 PHP php.ini 精確度解決方案來解決浮點問題嗎? 簡介浮點運算是一個經常被誤解的複雜主題,它遍布現代電腦系統。由於大多數小數缺乏精確的二進位表示,因此不可避免地會發生舍入。了解浮點運算的細微差別至關重要,如「每個電腦科學家應該了解的浮點算術知識」所述。 問題與解答問題1:我可以使...
    程式設計 發佈於2024-11-19
  • 委託如何增強 C++ 程式碼的靈活性和可維護性?
    委託如何增強 C++ 程式碼的靈活性和可維護性?
    解釋 C 中委託的通用概念 C 中的委託是一種程式設計結構,可讓您將函數指標作為參數傳遞。這使您能夠創建可以非同步調用或在不同上下文中調用的回調。 在C 中實作委託有多種方法,包括:函子函子是物件定義了一個operator()函數,有效地使它們可調用。 struct Functor { in...
    程式設計 發佈於2024-11-19
  • 如何在 Java 中建立動態命名物件?
    如何在 Java 中建立動態命名物件?
    使用字串派生變數名稱動態建立物件當嘗試使用動態產生的名稱建立物件時,Java 嚴格的變數命名規則可能看起來很有限。然而,這種明顯的限制實際上是 Java 關注變數引用以及變數名稱的重要性相對減弱的結果。 雖然 PHP 等腳本語言允許創建具有字串派生名稱的變量,但 Java 採用了不同的方法。 Jav...
    程式設計 發佈於2024-11-19
  • 你應該在 JavaScript 中使用自增和自減運算子嗎?
    你應該在 JavaScript 中使用自增和自減運算子嗎?
    JavaScript 中增量和減量運算符的爭議jslint 工具警告不要使用增量( ) 和減量(-- )運營商出於各種原因。然而,反對這些運算符的論點有些爭議。 反對 and 的論點 --jslint 工具特別指出,and -- 鼓勵「過度狡猾」和已知會導致安全漏洞。此外,PHP 構造 $foo[$...
    程式設計 發佈於2024-11-19
  • 如何使用 Python 從網站中提取每日日出/日落時間?
    如何使用 Python 從網站中提取每日日出/日落時間?
    使用Python 進行網頁抓取使用Python 進行網頁抓取使用Python 從網站擷取每日日出/日落時間問:使用Python 從網站擷取每日日出/日落時間您確實可以利用Python 的強大功能來抓取網頁內容並從網站中提取日出/日落時間等資料。 Python 提供了一套全面的模組來促進網頁抓取。讓我...
    程式設計 發佈於2024-11-19
  • 為什麼不能直接在 Go 中使用有類型約束的介面?
    為什麼不能直接在 Go 中使用有類型約束的介面?
    介面類型約束在開發 Go 應用程式時,了解介面類型約束所施加的限制至關重要。具有類型元素的介面類型(例如聯合)的使用受到限制。本文深入研究了介面類型約束的細節,並提供了範例來說明其影響。 使用類型約束定義介面在 Go 中,包含型別元素(例如聯合)的介面被考慮非基本。這意味著它們不能用作變數的類型或作...
    程式設計 發佈於2024-11-19
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-19
  • 如何使用Python在Linux下截圖?
    如何使用Python在Linux下截圖?
    在Linux 上使用Python 輕鬆截取螢幕截圖對於那些尋求透過Python 腳本輕鬆捕捉螢幕截圖的便捷方法的人來說,本指南提供了專為Linux 環境設計的有效解決方案。 Pythonic 螢幕截圖大師為了實現這種截圖能力,Python 利用了它與X Window 系統交互的能力,X Window...
    程式設計 發佈於2024-11-19
  • 如何使用 jQuery 即時動態更改 CSS 類別規則?
    如何使用 jQuery 即時動態更改 CSS 類別規則?
    使用 jQuery 動態更改 CSS 類別規則您的查詢涉及兩個方面:1。即時修改類別規則僅靠 jQuery 無法動態變更 CSS 類別規則。但是,您可以利用文件物件的 styleSheets 屬性直接存取 CSS 規則。 代號:document.getElementById("button...
    程式設計 發佈於2024-11-19

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3