PythonでWebAPIを作ろう! Fast APIでスピード開発体験を!

PythonでWebAPIを作ろう! Fast APIでスピード開発体験を!

Clock Icon2023.04.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、稲葉です。

前にテック系の記事を読んでいたら、FastAPIと言うものを見つけました。

気になり調べてみたら、名前の通り API を構築するための Python の Web フレームワークだと分かり。

Python の Web フレームワークなら少し触ってみたい思い。 さっそく、FastAPI で簡単な WebAPIを作ってみました。

という事で,今回はFastAPI を使っての API の構築の仕方を紹介したいと思います。

インストール

はじめにFastAPIをインストールします。

pip install fastapi

また、サーバーとして動作するのに必要なuvicornをインストールします。

pip install uvicorn

これでAPI 構築に必要な物のインストールは完了です。

構築

今回は簡単な税込み価格を出すだけの APIを作ります。

では早速、コードを書いていきたいと思います。

まず、名前はなんでも良いのですが、ここではfast_api という名前のフォルダーとその中にmain.pyを作成。

from fastapi import FastAPI
from pydantic import BaseModel

class TaxIn(BaseModel):
    cost: int
    tax_rate: float

app = FastAPI()

@app.get("/")
def index():
    return {"message": "Hello World"}

@app.post("/")
def calc(data: TaxIn):
    in_tax_cost = data.cost * (1 + data.tax_rate)
    return {'税込み価格': in_tax_cost}

インポートした BaseModelと言うのは、型推論に使います。 これをすることでcost には int 型しか代入できず、tax_rate には float 型しか代入できなくなります。

そして、API が呼ばれた時の引数 data に TaxIn の型を当てる。

これでAPI 側のコードは完了です。

なので、一旦動かしてみたいと思います。

ターミナルを開き、以下のコマンドを打ち込みます。

uvicorn fast_api.main:app --reload

そうすると以下の画像のように、ターミナルに出力されます。

このURL をクリックしますと、このような画面になります。

作成した API の詳細を見るには、上記のURL の後ろに/docsと追加する。

そうすると、このような画面になり詳細が分かります。

次に API を呼び出すために、src下に test.py(名前はなんでも良いです)を作成。

import requests
import json

def main():
    url = 'http://127.0.0.1:8000/' # 先ほどターミナルに出力されたURL
    data = {
        'cost': 100,
        'tax_rate': 0.1
    }

    # ここでAPIを呼び出す,データはjson形式ではないとエラーが起きる
    res = requests.post(url, json.dumps(data))
    print(res.json())

if __name__ == '__main__':
    main()

これで呼び出し側のコードも完成です。

先ほどのターミナルを開いたまま、別のターミナルを開き python test.pyと打ちます。

こちらが実際のターミナルの出力例です。

まとめ

今回はFastAPI を使った WebAPI の構築の仕方を紹介しました。

税込み価格を出すだけの簡単な API だったこともあり、 あっという間(Fast)に作成できました。(想像以上の速さでした)

FastAPI は公式ドキュメントが詳細に分かりやすく書かれているため、 これを機に興味を持って頂いた方はぜひ覗いて見てみて下さい。

最後まで読んでくださりありがとうございます。

 

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.