FastAPI 學習之路(十二)介面幾個額外資訊和額外資料型別

北漂的雷子發表於2021-10-17

系列文章:

  FastAPI 學習之路(一)fastapi--高效能web開發框架

  FastAPI 學習之路(二)

  FastAPI 學習之路(三)

  FastAPI 學習之路(四)

  FastAPI 學習之路(五)

      FastAPI 學習之路(六)查詢引數,字串的校驗

  FastAPI 學習之路(七)字串的校驗

    FastAPI 學習之路(八)路徑引數和數值的校驗

  FastAPI 學習之路(九)請求體有多個引數如何處理?

  FastAPI 學習之路(十)請求體的欄位

     FastAPI 學習之路(十一)請求體 - 巢狀模型 

一、額外資訊

我們有這樣的一個需求,我們希望可以看到介面的一個簡單的請求示例展示在我們的介面文件中,應該如何實現呢。我們看下如何實現的:
from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None
    class Config:
        schema_extra = {
            "example": {
                "name": "DEMO",
                "description": "DEMO",
                "price": 20,
                "tax": 0.5,
            }
        }
@app.post("/items/")
def return_item( item: Item):
    results = { "item": item}
    return results

那麼我們請求下試試。

 

 介面滿足我們的請求,我們看下介面文件是否有請求的示例。

 

 

 介面文件是正常有這個的示例。程式碼中使用Config 和 schema_extra 為Pydantic模型宣告一個簡單的示例。

其實我們在Field也會可以實現一個額外的資訊,比如我們增加一個example欄位,我們看下如何實現的,帶來什麼樣的效果

 
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel,Field
app = FastAPI()
class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price:float = Field(..., example=600)
    tax: Optional[float] = Field(None, example=0.5)

@app.post("/items/")
def return_item( item: Item):
    results = { "item": item}
    return results

 我們看下效果,正常的介面請求沒有變動。

 

  我們看下介面的文件。文件在解析的時候,會解析出來這個額外的資訊。

 

 當然像Body,Path等也都可以增加這些引數。

二、 額外資料型別

到目前為止,您一直在使用常見的資料型別,如:

  • int

  • float

  • str

  • bool

但是您也可以使用更復雜的資料型別。

您仍然會擁有現在已經看到的相同的特性:

  • 很棒的編輯器支援。

  • 傳入請求的資料轉換。

  • 響應資料轉換。

  • 資料驗證。

  • 自動補全和文件。

其他資料型別

下面是一些你可以使用的其他資料型別:

  • UUID:

    • 一種標準的 "通用唯一識別符號" ,在許多資料庫和系統中用作ID。

    • 在請求和響應中將以 str 表示。

  • datetime.datetime:

    • 一個 Python datetime.datetime.

    • 在請求和響應中將表示為 ISO 8601 格式的 str ,比如: 2008-09-15T15:53:00+05:00.

  • datetime.date:

    • Python datetime.date.

    • 在請求和響應中將表示為 ISO 8601 格式的 str ,比如: 2008-09-15.

  • datetime.time:

    • 一個 Python datetime.time.

    • 在請求和響應中將表示為 ISO 8601 格式的 str ,比如: 14:23:55.003.

  • datetime.timedelta:

    • 一個 Python datetime.timedelta.

    • 在請求和響應中將表示為 float 代表總秒數。

    • Pydantic 也允許將其表示為 "ISO 8601 時間差異編碼", 檢視文件瞭解更多資訊。

  • frozenset:

    • 在請求中,列表將被讀取,消除重複,並將其轉換為一個 set

    • 在響應中 set 將被轉換為 list 。

    • 產生的模式將指定那些 set 的值是唯一的 (使用 JSON 模式的 uniqueItems)。

    • 在請求和響應中,作為 set 對待:

  • bytes:

    • 標準的 Python bytes

    • 在請求和相應中被當作 str 處理。

    • 生成的模式將指定這個 str 是 binary "格式"。

  • Decimal:

    • 標準的 Python Decimal

    • 在請求和相應中被當做 float 一樣處理。

  下面是一個介面操作的示例,其中的引數使用了上面的一些型別。

from typing import Optional
from uuid import UUID
from fastapi import Body, FastAPI
from datetime import datetime, time, timedelta
app = FastAPI()
@app.put("/items/{id}")
async def read_items(
    item_id: UUID,
    start_time: Optional[datetime] = Body(None),

    end_time: Optional[datetime] = Body(None),


    after: Optional[timedelta] = Body(None),

):
    start_process = start_time 
    duration = end_time - start_process
    return {
        "id": item_id,
        "start_datetime": start_time,
        "end_datetime": end_time,
        "after": after,
        "start_process": start_process,
        "duration": duration,
    }

 那麼我們看下介面文件的請求。

 

 

 UUId來源        http://www.uuid.online/可以生成。

        這樣就是我們利用了這些引數的一個請求。

 

 

文章首發在公眾號,歡迎關注。

相關文章