フリーランス
エンジニア
PythonのWebフレームワークFastAPIの紹介
はじめに
PythonのWebフレームワークにはDjango、Flaskが良く使用されますが、今回はFastAPIというフレームワークを紹介したいと思います。
FastAPI は、Pythonの標準である型ヒントに基づいてPython 3.6 以降でAPI を構築するための、モダンで、高速(高パフォーマンス)な、Web フレームワークです。
FastAPIの特徴とDjangoとの比較について
・パフォーマスが高く、処理が早い
FastAPIはPythonの有名なWebフレームワークのDjangoパフォーマンスを比較しても、NodeJSやGoと同じくらいにパフォーマンスが高いと言われており、Djangoよりも処理が早いとされています。
・コードが書きやすく、バグ等も見つけやすい
コーディングもDjangoに比べて書きやすい特徴もあり、コードによる重複も最小限にしていることから、ヒューマンエラーよるバグも削減と開発速度の向上が見込まれています。
・習得にそれほど時間がかからない
FastAPIはDjangoに比較して簡単に習得できるようにデザインもされていることから、ドキュメントに読む時間やその他調査にかかる時間も短縮されます。
初期設定
必要条件:Python 3.6以上
※開発環境(動作はMac環境を使用しています。)
OS: MacOS Big Sur 11.4
Python: 3.9.7
Django: 3.1.7
IDE: PyCharm
Pycharmを起動して、左下の「terminal」をクリック
(Macのデスクトップの右上の虫眼鏡マークから「ターミナル」起動→指定した階層に移動でも構いません)
ターミナル上で以下のコマンドを入力してください。
pip install fastapi
以下のように「Successfully〜」と表示されれば問題なくFastAPIはインストールされています。
次に以下のコマンドを入力後、エンターキーを押してください。
pip install uvicorn
こちらも問題なく、エラーメッセージが表示されなければ正常にインストールされています。
アプリケーションの作成
任意のディレクトリ配下にmain.pyを作成して、以下のコードを入力します。
main.py
以下のコマンドを実行します。
uvicorn main:app --reload
ブラウザのURLバーに
http://localhost:8000/
を入力してください。
{"Hello":"World"}と表示されていますね。
先程作成した、main.pyの5行目から7行目にて
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/")
→@app.get("/")と書くことで、localhost:8000以降のURLを指定するパスになります。
("/")と書くことにより、localhost:8000で動く関数ということになります。
def read_root():
return {"Hello": "World"}
→@app.get("/")と書いてありますので、
uvicorn main:app –reload
Webサーバーを起動した際にWebブラウザにて
localhost:8000と入力した時に動く関数ということになります。
こちらのサンプルではread_rootという関数名にしていますが、任意の関数名に変えていただいても構いません。
returnも{"Hello": "World"}とありますが、こちらも任意の文字列に変えてもよいです。
では次にブラウザのURLバーにて
http://localhost:8000/items/10?q=sample_fastapi
を入力してください。
このように表示されていれば成功です。
解説
解説をしていきます。
main.pyに記載をした@app.get("/")と@app.get("/items/{item_id}")の2つ関数がありますが、WebブラウザのURLにて、localhost:8000以降の/ と /items/{item_id}のパスで HTTP リクエストを受けます。
/items/{item_id} パスのパスパラメータ item_id は int でなければなりません。
http://localhost:8000/items/10?q=sample_fastapi
→こちらの10という数値がint型指定です。
パス /items/{item_id} はオプションの str クエリパラメータ q を持ちます。
http://localhost:8000/items/10?q=sample_fastapi
→sample_fastapiの箇所がstr型となります。
@app.get("/items/{item_id}")
def readitem(itemid: int, q: str = None):
return{"item_id": item_id, "q": q}
今回使用したURLですと、
http://localhost:8000/items/10
→10がread_item_idの第一引数の、item_id: intの箇所で
http://localhost:8000/items/10?q=sample_fastapi
→sample_fastapiがread_item_idの第二引数のq: str = Noneの箇所になります。
試しにhttp://localhost:8000/items/{item_id}の{item_id}の箇所にて、int(数値)以外の値を入れてみましょう。
WebブラウザでURLバーにて以下を入力してみてください。
http://localhost:8000/items/sample?q=sample
value is not a valid integer〜とエラーメッセージが出力されましたね。
では次に行きましょう。
WebブラウザのURLバーで以下を入力してください。
http://localhost:8000/docs
こちらの画面が表示されましたと思います。
こちらは自動対話型APIドキュメントです。
次は以下のURLをWebブラウザで表示させてください。
http://localhost:8000/redoc
代替の自動ドキュメントが表示されます。
アップグレードの実装(PUTリクエスト)
PUTリクエストからボディを受け取る実装を進めます。
main.pyを修正しますので、黄色の部分を追加してください。
main.py
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
@apgep.t("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
次は以下のURLをWebブラウザで表示させてください。
http://localhost:8000/docs
Try it outをクリック
item_idに任意の数値を入力し
※画面の例の10以外の数値でも可
Executeボタンをクリック
ユーザインターフェースはAPIと通信をして、パラメータを送信し、結果を取得して、画面下部に表示されます。
次は以下のURLをクリックしてください。
http://localhost:8000/redoc
代替のAPIにも新しいクエリパラメータやボディが反映されています
まとめ
このようにFastAPIは関数のパラメータとして、パラメータやボディ の型を宣言して、簡単にAPIエンドポイント定義と実装が可能になります。
参考URL
https://fastapi.tiangolo.com/ja
中川 彰吾
フリーランスSEで色々なWeb系の案件に参画中。言語はPythonやRuby 自宅でもパフォーマンスが落ちない様、リモートワーク中心の生活を過ごしながら、 IT技術だけでなく、英語や株式投資など学習中。