本記事について
この記事はプログラミング初学者の私が学んでいく中でわからない単語や概要を分かりやすくまとめたものです。
もし不正などありましたらコメントにてお知らせいただければ幸いです。
postメソッド
Pydantic は、Python の型アノテーションを利用して、実行時における型ヒントを提供したり、データのバリデーション時のエラー設定を簡単に提供してくれるためのライブラリです。
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel): # BaseModelを継承してItemを作る
# データの構造を定義
name: str
description: Optional[str] = None
price: int
tex: Optional[float] = None
app = FastAPI()
@app.post("/item/")
async def create_item(item: Item): # 商品追加の関数 Itemで型アノテーションしている
return {f"{item.name}は、税込み価格{int(item.price*item.tex)}円です。"}
/docs
で確認するとドキュメントが見れることができる。
そこでTry it out
を押すと
値を入れることができるので、そこでテストが出来ます。
作成したAPIをpythonで叩いてみる
test_api.pyファイルを作り、そこから動かす
import json
import requests
def main():
url = 'http://127.0.0.1:8000/item/' # エンドポイント
# 辞書型(jsonではない)
body = {
"name": "としきライダー",
"description": "仮面ライダー",
"price": 3000,
"tex": 1.1
}
# json.dumps(body) 辞書型をjsonの文字列にする。
res = requests.post(url, json.dumps(body))
print(res.json())
if __name__ == "__main__":
main()
ターミナルで
python3 .\test_api.py
を実行
['としきライダーは、税込み価格3300円です。']
こちらが帰ってきました。成功です。
入れ子構造になっているリクエストボディ
データ構造
{
"shop_info": {
"name": "利樹のお店",
"location": "北海道"
},
"items": [
{
"name": "としきライダー",
"description": "仮面ライダー",
"price": 3000,
"tex": 1.1
},
{
"name": "アッキーライダー",
"description": "仮面ライダー2号",
"price": 5000,
"tex": 1.1
}
]
}
from typing import Optional, List # Listを追加
from fastapi import FastAPI
from pydantic import BaseModel
class ShopInfo(BaseModel):
name: str
location: str
class Item(BaseModel): # BaseModelを継承してItemを作る
# データの構造を定義
name: str
description: Optional[str] = None
price: int
tex: Optional[float] = None
class Data(BaseModel):
shop_info: Optional[ShopInfo] = None
items: List[Item] # リスト形式でデータがあったため
app = FastAPI()
@app.post("/")
async def index(data: Data):
return {"data": data}
/docs
にて検証を行うことできます。
バリデーション
from typing import Optional, List
from fastapi import FastAPI
from pydantic import BaseModel, Field # Fieldを追加
class ShopInfo(BaseModel):
name: str
location: str
class Item(BaseModel):
# データの構造を定義
name: str = Field(min_length=4, max_length=12) # 文字数を制限できる
description: Optional[str] = None
price: int
tex: Optional[float] = None
class Data(BaseModel):
shop_info: Optional[ShopInfo] = None
items: List[Item]
app = FastAPI()
@app.post("/")
async def index(data: Data):
return {"data": data}
参考