­

FastAPI 學習之路(十二)接口幾個額外信息和額外數據類型

系列文章:

  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來源        //www.uuid.online/可以生成。

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

 

 

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