サイトアイコン たーちゃんの「ゼロよりはいくらかましな」

FastAPIさわってみる2

前回、こちらでインストールから動かしてみるところまでやってみました。

今回はもう少し実践的な使い道を探ってみますー。

 

 

 

URLパラメータ

URLに渡された値をパラメータとして使用できます。

値を中括弧で囲みその名前でメソッド引数として受けます。

 

 

サンプルではgetメソッドで使用していますが、

postメソッドでも同じです。

 

 

@app.get("/{param1}")
async def hello2(param1: str):
    return {"param1": param1}

 

 

リクエスト・レスポンスのモデル化

リクエストとレスポンスのそれぞれにおいて、

データモデルを指定することができます。

 

from pydantic import BaseModel
from typing import List, Union
from pydantic import Field, validator


class RequestChild(BaseModel):
    name: str
    age: int = Field(..., gt=10, le=100)


class RequestParent(BaseModel):
    id: str
    children: List[RequestChild]

    @validator("id")
    @classmethod
    def check_id(cls, value: str) -> Union[str, ValueError]:
        if value == "error_id":
            raise ValueError("id is error id")
        return value


class ResponseChild(BaseModel):
    name: str
    age: int
    priority: int


class ResponseParent(BaseModel):
    message: str
    children: List[RequestChild]

 

モデルはclassで定義します。

ネストさせることもできます。

 

validation

各フィールドのvalidationはclassのフィールド定義と共に記述します。

Field(..., gt=10, le=100)

 

第1引数に…と指定することでフィールドが必須(required)になります。

フィールド定義だけでもデフォルト必須になります。

 

 

第2引数以降にvalidation条件を指定していきます。

このサンプルだと10より大きく、100未満であることを検査しています。

他にはmin_length、max_length、regexなど一般的なものは用意されています。

詳しくはこちらで。

 

 

また、独自のvalidationも以下のように記述可能です。

validatorデコレータの引数にフィールド名を与えて、

どのようにチェックするかを記述します。

    @validator("id")
    @classmethod
    def check_id(cls, value: str) -> Union[str, ValueError]:
        if value == "error_id":
            raise ValueError("id is error id")
        return value

 

 

使用方法

モデルは以下のように使用します。

 

@app.post("/post/request-model", response_model=ResponseParent)
async def hello3(request: RequestParent):
    child = ResponseChild(
        name=request.children[0].name,
        age=request.children[1].age,
        priority=100,
    )

    res = ResponseParent(message="This is response message.", children=[child])

    return res

 

リクエストモデルはメソッドの引数として定義し、

レスポンスモデルはpostメソッドの定義のパラメータとして、

response_modeにクラス名を記載します。

 

 

return するときにはjsonに変換する必要はなく、

オブジェクトをそのまま返却することができます。

 

 

 

【おまけ】vscodeでuvicorn起動させデバッグする

vscodeでデバッグするには、launch.jsonに以下のように記載すればOK。

この方法で起動すれば、swaggerからの実行などで、

ブレークポイントでストップさせることができるようになります。

 

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "FastAPI Debug",
            "type": "python",
            "request": "launch",
            "module": "uvicorn",
            "args": [
                "sample:app",
                "--reload"
            ]
        }
    ]
}

 

 

 

まとめ

ということで、FastAPIにはまだまだ機能はたくさんあるものの、

基本的なことはこれでできそうかなーという印象です。

 

 

いつか仕事で出会える日を楽しみにしてますー。

それでは!!!

 

 


にほんブログ村


人気ブログランキング

モバイルバージョンを終了