前回、こちらでインストールから動かしてみるところまでやってみました。
今回はもう少し実践的な使い道を探ってみますー。
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にはまだまだ機能はたくさんあるものの、
基本的なことはこれでできそうかなーという印象です。
いつか仕事で出会える日を楽しみにしてますー。
それでは!!!
20代前半までは東京で音楽をやりながら両手の指以上の業種でアルバイト生活をしていましたが、某大手プロバイダのテレアポのバイトでPCの知識の無さに愕然とし、コンピュータをもっと知りたい!と思ったことをきっかけに25歳の時にITの世界に未経験で飛び込みました。
紆余曲折を経て、現在は個人事業主としてお仕事させていただいており、10年ほどになります。
web制作から企業システム構築、ツール開発など、フロントエンドもバックエンドもサーバーもDBAも依頼があれば何でもやってきた雑食系エンジニアです。
今風にいうとフルスタックエンジニアということになるのでしょうか??
→ 詳細プロフィールというか、生い立ちはこちら
→スキルシートをご覧になる場合はこちら
→お仕事のご依頼やお見積りなどお問い合わせはこちらから!
コメント