0
2

More than 1 year has passed since last update.

40代おっさんFastAPIを勉強する②

Posted at

本記事について

この記事はプログラミング初学者の私が学んでいく中でわからない単語や概要を分かりやすくまとめたものです。
もし不正などありましたらコメントにてお知らせいただければ幸いです。

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}

参考

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2