最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Pydantic封裝的通用模型在API請(qǐng)求驗(yàn)證中的應(yīng)用詳解

 更新時(shí)間:2023年05月01日 10:37:42   作者:憶想不到的暉  
這篇文章主要介紹了基于Pydantic封裝的通用模型在API請(qǐng)求驗(yàn)證中的應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪

引言

Pydantic 是一個(gè)用于數(shù)據(jù)驗(yàn)證和解析的流行庫(kù),經(jīng)常被用于 FastAPI 和其他現(xiàn)代 Python 項(xiàng)目中。在處理 API 請(qǐng)求時(shí),我們經(jīng)常需要對(duì)請(qǐng)求參數(shù)進(jìn)行有效性檢查,例如日期范圍、分頁(yè)和排序等。在本文中,我們將介紹如何在 Pydantic 中使用 Mixin 和組合模式來(lái)實(shí)現(xiàn)這些功能,并討論它們的優(yōu)缺點(diǎn)。

通用model

首先,我們定義了以下幾個(gè)基礎(chǔ)的 Pydantic 模型:

  • DateModel:用于表示日期范圍,包含開(kāi)始日期和結(jié)束日期。
  • OrderModel:用于表示排序參數(shù),包含排序字段和排序方式(升序或降序)。
  • PageModel:用于表示分頁(yè)參數(shù),包含頁(yè)碼和每頁(yè)數(shù)量。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author: hui
# @Desc: { 通用的一些Pydantic模型 }
# @Date: 2023/03/30 11:57
from pydantic import BaseModel, Field, validator
from typing import Optional
from datetime import date


class DateModel(BaseModel):
    """日期模型"""

    start_date: Optional[date] = Field(None, description="開(kāi)始日期")
    end_date: Optional[date] = Field(None, description="結(jié)束日期")

    @validator("end_date", always=True)
    def validate_end_date(cls, end_date, values):
        start_date = values.get("start_date")
        if all([start_date, end_date]) and end_date < start_date:
            raise ValueError("結(jié)束日期必須大于等于開(kāi)始日期")
        return end_date


class OrderModel(BaseModel):
    """排序模型"""

    order_by: Optional[str] = Field(None, description="排序字段,逗號(hào)分隔")
    order_mode: Optional[str] = Field(None, description="排序方式,逗號(hào)分隔,asc升序desc降序")

    @validator("order_by", "order_mode", always=True)
    def split_comma_separated_string(cls, value):
        if value:
            return value.split(",")
        return value

    @validator("order_mode", always=True)
    def check_length(cls, order_mode, values):
        order_by = values.get("order_by")
        if order_by and order_mode and len(order_by) != len(order_mode):
            raise ValueError("order_by and order_mode must have the same length")
        return order_mode


class PageModel(BaseModel):
    """分頁(yè)模型"""

    page: Optional[int] = Field(default=1, ge=1, description="頁(yè)碼")
    page_size: Optional[int] = Field(default=10, le=1000, description="每頁(yè)數(shù)量, 默認(rèn)10,最大1000")

接下來(lái),我們通過(guò)混入(Mixin)和組合兩種不同的方式將這些基礎(chǔ)模型應(yīng)用到一個(gè)實(shí)際的 API 請(qǐng)求中。

Mixin 模式

DateOrderModelMixin 類通過(guò)多重繼承的方式繼承了 DateModel 和 OrderModel。這種方式的優(yōu)點(diǎn)是簡(jiǎn)單易懂,可以實(shí)現(xiàn)代碼重用。然而,它也可能導(dǎo)致類層次結(jié)構(gòu)變得復(fù)雜,尤其是當(dāng)有多個(gè) Mixin 之間存在依賴關(guān)系時(shí)。

class DateOrderModelMixin(DateModel, OrderModel):
    """日期與排序模型Mixin"""
    pass

組合模式

PageOrderModel 類通過(guò)組合的方式將 OrderModel 和 PageModel 作為它的屬性。在初始化方法中,我們將請(qǐng)求參數(shù)映射到這兩個(gè)模型,并調(diào)用基類的初始化方法。

組合模式的優(yōu)點(diǎn)是代碼結(jié)構(gòu)更清晰,易于維護(hù)和擴(kuò)展。但是,它可能需要編寫(xiě)更多的代碼來(lái)將功能委托給組合的組件。

class PageOrderModel(BaseModel):
    """分頁(yè)排序模型"""
    order_model: OrderModel = Field(OrderModel(), description="排序模型")
    page_model: PageModel = Field(PageModel(), description="分頁(yè)模型")
    def __init__(self, **data):
        if "order_model" in data and "page_model" in data:
            order_model = data.pop("order_model", None)
            page_model = data.pop("page_model", None)
        else:
            # 用于直接平鋪的字典入?yún)?
            order_params = {
                "order_by": data.pop("order_by", None),
                "order_mode": data.pop("order_mode", None),
            }
            page_params = {
                "page": data.pop("page", None),
                "page_size": data.pop("page_size", None),
            }
            order_model = OrderModel(**order_params)
            page_model = PageModel(**page_params)
        super().__init__(order_model=order_model, page_model=page_model, **data)
page_order = PageOrderModel(
    order_model=OrderModel(order_by="field1,field2", order_mode="asc,desc"),
    page_model=PageModel(page=1, page_size=10)
)
>>>out
order_model=OrderModel(order_by=['field1', 'field2'], order_mode=['asc', 'desc'])
page_model=PageModel(page=1, page_size=10)
req_params = {
    "order_by": "field1,field2",
    "order_mode": "asc,desc",
    "page": 1,
    "page_size": 10
}
req_model = PageOrderModel(**req_params)
>>>out
order_model=OrderModel(order_by=['field1', 'field2'], order_mode=['asc', 'desc'])
page_model=PageModel(page=1, page_size=10)

再來(lái)幾個(gè)業(yè)務(wù)邏輯模型繼承 DateOrderModelMixin 和 PageOrderModel 然后模擬一些請(qǐng)求參數(shù)去驗(yàn)證

讓我們創(chuàng)建兩個(gè)業(yè)務(wù)邏輯模型,一個(gè)用于查詢商品信息,另一個(gè)用于查詢訂單信息。這兩個(gè)模型分別繼承 DateOrderModelMixin 和 PageOrderModel。

from pydantic import BaseModel, Field
from typing import Optional

class ProductQueryModel(DateOrderModelMixin):
    product_category: Optional[str] = Field(None, description="商品類別")


class OrderQueryModel(PageOrderModel):
    customer_id: Optional[int] = Field(None, description="客戶ID")


# 使用 ProductQueryModel 進(jìn)行參數(shù)驗(yàn)證
product_query_params = {
    "start_date": "2023-04-01",
    "end_date": "2023-04-30",
    "order_by": "price",
    "order_mode": "desc",
    "product_category": "Electronics"
}

product_query = ProductQueryModel(**product_query_params)

>>>out
order_by=['price'] order_mode=['desc'] start_date=datetime.date(2023, 4, 1) end_date=datetime.date(2023, 4, 30) product_category='Electronics'


# 使用 OrderQueryModel 進(jìn)行參數(shù)驗(yàn)證
order_query_params = {
    "start_date": "2023-04-01",
    "end_date": "2023-04-30",
    "order_by": "order_date",
    "order_mode": "asc",
    "page": 1,
    "page_size": 20,
    "customer_id": 12345
}

order_query = OrderQueryModel(**order_query_params)

>>>out
order_model=OrderModel(order_by=['order_date'], order_mode=['asc']) page_model=PageModel(page=1, page_size=20) customer_id=12345

這里的 ProductQueryModel 和 OrderQueryModel 分別用于處理商品查詢和訂單查詢的請(qǐng)求參數(shù)。ProductQueryModel 繼承自 DateOrderModelMixin,因此它具有日期范圍和排序功能。OrderQueryModel 則繼承自 PageOrderModel,具有分頁(yè)和排序功能。

通過(guò)這兩個(gè)模型,我們可以輕松地驗(yàn)證和解析傳入的請(qǐng)求參數(shù)。在上面的示例代碼中,我們分別創(chuàng)建了 product_query_params 和 order_query_params 字典來(lái)模擬請(qǐng)求參數(shù),并使用 ProductQueryModel 和 OrderQueryModel 進(jìn)行驗(yàn)證。可以看到,這兩個(gè)模型成功解析了請(qǐng)求參數(shù),并對(duì)日期范圍、排序和分頁(yè)進(jìn)行了驗(yàn)證。

結(jié)論

在處理Pydantic模型時(shí),根據(jù)具體的業(yè)務(wù)場(chǎng)景和需求來(lái)選擇組合或Mixin模式。

Mixin模式適用于簡(jiǎn)單的繼承關(guān)系,代碼簡(jiǎn)潔易懂;組合模式適用于復(fù)雜的類關(guān)系,提供更好的靈活性和擴(kuò)展性。在實(shí)際項(xiàng)目中,可以根據(jù)需求靈活選擇這兩種模式,或者根據(jù)情況將它們結(jié)合使用。

在實(shí)踐中,如果需要將多個(gè)通用功能混合到一個(gè)業(yè)務(wù)邏輯模型中,Mixin模式可能是一個(gè)更好的選擇,因?yàn)樗梢宰屛覀冚p松地將這些功能組合在一起。然而,當(dāng)我們需要對(duì)這些功能進(jìn)行更精細(xì)的控制,或者在多個(gè)業(yè)務(wù)邏輯模型之間共享某些功能時(shí),組合模式可能會(huì)更合適。

總之,在處理Pydantic模型時(shí),我們應(yīng)根據(jù)項(xiàng)目的實(shí)際需求和場(chǎng)景來(lái)權(quán)衡這兩種模式的優(yōu)缺點(diǎn),從而做出合適的選擇。這里的入?yún)⑿r?yàn)感覺(jué)使用多繼承會(huì)更簡(jiǎn)單點(diǎn),但到一些復(fù)雜的業(yè)務(wù)邏輯處理時(shí)可以使用組合模式,來(lái)做到更好的維護(hù)與擴(kuò)展。

由于 GET 請(qǐng)求的入?yún)⒉惶枚x數(shù)據(jù)結(jié)構(gòu),減少的代碼冗余就想到了多繼承來(lái)組合屬性和方法,如果使用 POST 請(qǐng)求傳遞 json 數(shù)據(jù)入?yún)⒕涂梢愿迷O(shè)計(jì)參數(shù)結(jié)構(gòu),這時(shí)使用組合的方式hui更好。

雜談

go的結(jié)構(gòu)體嵌套就有點(diǎn)像組合

type Address struct {
    Street string
    City   string
    State  string
    Zip    string
}

type Person struct {
    Name    string
    Age     int
    Address Address
}

通過(guò)結(jié)構(gòu)體的組合,可以方便地組合多個(gè)不同的數(shù)據(jù)結(jié)構(gòu),構(gòu)建出更加復(fù)雜的結(jié)構(gòu)體。這種組合方式可以讓代碼更加靈活和可維護(hù),同時(shí)也可以提高代碼的可讀性和可重用性。

以上就是基于Pydantic封裝的通用模型在API請(qǐng)求驗(yàn)證中的應(yīng)用詳解的詳細(xì)內(nèi)容,更多關(guān)于Pydantic封裝API請(qǐng)求驗(yàn)證的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python functools.lru_cache裝飾器性能提升利器深入探究

    Python functools.lru_cache裝飾器性能提升利器深入探究

    本文將詳細(xì)介紹functools.lru_cache裝飾器的原理、用法以及適當(dāng)?shù)膱?chǎng)景,以幫助你更好地利用這一功能,它可以用來(lái)緩存函數(shù)的輸出,以避免重復(fù)計(jì)算,從而顯著提高程序的執(zhí)行速度
    2024-01-01
  • Python編程中*args與**kwargs區(qū)別作用詳解

    Python編程中*args與**kwargs區(qū)別作用詳解

    這篇文章主要介紹了Python編程中*args與**kwargs區(qū)別作用詳解
    2021-10-10
  • Python爬蟲(chóng)爬取疫情數(shù)據(jù)并可視化展示

    Python爬蟲(chóng)爬取疫情數(shù)據(jù)并可視化展示

    這篇文章主要介紹了Python利用爬蟲(chóng)爬取疫情數(shù)據(jù)并進(jìn)行可視化的展示,文中的示例代碼講解清晰,對(duì)工作或?qū)W習(xí)有一定的價(jià)值,需要的朋友可以參考一下
    2021-12-12
  • python3用PIL把圖片轉(zhuǎn)換為RGB圖片的實(shí)例

    python3用PIL把圖片轉(zhuǎn)換為RGB圖片的實(shí)例

    今天小編就為大家分享一篇python3用PIL把圖片轉(zhuǎn)換為RGB圖片的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • python人工智能tensorflow構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)CNN

    python人工智能tensorflow構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)CNN

    學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)已經(jīng)有一段時(shí)間,從普通的BP神經(jīng)網(wǎng)絡(luò)到LSTM長(zhǎng)短期記憶網(wǎng)絡(luò)都有一定的了解,但是從未系統(tǒng)的把整個(gè)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)記錄下來(lái),我相信這些小記錄可以幫助我更加深刻的理解神經(jīng)網(wǎng)絡(luò)
    2022-05-05
  • python異步編程之a(chǎn)syncio高階API的使用詳解

    python異步編程之a(chǎn)syncio高階API的使用詳解

    asyncio中函數(shù)可以分為高階函數(shù)和低階函數(shù),通常開(kāi)發(fā)中使用更多的是高階函數(shù),本文主要為大家介紹了asyncio中常用的高階函數(shù),需要的可以參考下
    2024-01-01
  • Python使用sftp實(shí)現(xiàn)上傳和下載功能

    Python使用sftp實(shí)現(xiàn)上傳和下載功能

    這篇文章主要為大家詳細(xì)介紹了Python使用sftp實(shí)現(xiàn)上傳和下載功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Pycharm中import?torch報(bào)錯(cuò),python中import?torch不報(bào)錯(cuò)的解決

    Pycharm中import?torch報(bào)錯(cuò),python中import?torch不報(bào)錯(cuò)的解決

    這篇文章主要介紹了Pycharm中import?torch報(bào)錯(cuò),python中import?torch不報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Python使用JWT的超詳細(xì)教程

    Python使用JWT的超詳細(xì)教程

    這篇文章主要介紹了Python使用JWT的相關(guān)資料,JWT(JSON?Web?Tokens)是一種網(wǎng)絡(luò)應(yīng)用間傳輸信息的標(biāo)準(zhǔn),包括三部分:Header(頭部),Payload(負(fù)載),Signature(簽名),頭部包含聲明類型和算法,需要的朋友可以參考下
    2024-10-10
  • python之singledispatch單分派問(wèn)題

    python之singledispatch單分派問(wèn)題

    這篇文章主要介紹了python之singledispatch單分派問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評(píng)論

龙川县| 南皮县| 中方县| 黄浦区| 永顺县| 嘉峪关市| 绥阳县| 乐业县| 滨海县| 屏山县| 景德镇市| 广昌县| 永吉县| 天水市| 崇明县| 肇州县| 香港| 濮阳县| 兰溪市| 兴安盟| 高青县| 军事| 石首市| 班玛县| 肇州县| 丰宁| 水富县| 禄劝| 永济市| 伊金霍洛旗| 乐清市| 二连浩特市| 威信县| 文登市| 洮南市| 望都县| 宁河县| 进贤县| 贵阳市| 竹溪县| 措美县|