FastAPIとは
Pythonのフレームワークで、高速でAPIを構築するためのフレームワークです。
参考動画
Pythonのバージョン
Python3のバージョンです。
特徴
- 初学者向けのフレームワーク
- わかりやすい書き方
- 公式ドキュメントが豊富
- 自動ドキュメントを作る機能(Swaggerと連携取れている)
- バリデーション機能の実装簡単
- 型安全
- 高速
初学者がPythonのAPI開発ならFastAPIがベストです。
発展的に学ぶ場合は以下のことを知っているといいみたいです。
タイプヒントを用いたバリデーション、非同期処理、オリジン間リソース共有(CORS)、GraphQL、WebSocketsなどです。
Flaskと似ている
Flaskと書き方が似ているので、やったことある方はやりやすいと思います。
python3.5から導入された型ヒント(type hints)
FastAPIの型ヒント(type hints)は、関数の引数と戻り値のデータ型を指定するためのPythonの注釈機能です。
まずは簡単に消費税から計算します。
# 型ヒント
price:int = 1000
tax:float = 1.1
def calc_price_including_tax(price:int,tax:float) -> int:
return int(price*tax)
if __name__ == '__main__':
print(f'{calc_price_including_tax(price=price,tax=tax)}円')
# 1100円と出力
ここで注意点で、型ヒントは注釈に過ぎないので、以下のように間違えた実装してもエラーにならないです。
# 型ヒント
price:int = 1000.1
tax:float = 10
def calc_price_including_tax(price:int,tax:float) -> int:
return int(price*tax)
if __name__ == '__main__':
print(f'{calc_price_including_tax(price=price,tax=tax)}円')
# 10001円
ライブラリインストール
仮想環境を使用してFastAPIをインストールします。
-
FastAPIのインストール
仮想環境がアクティブな状態でFastAPIとUvicornをインストール。
pip install fastapi uvicorn
FastAPI起動
まずは下のコードを見てください。
from fastapi import FastAPI
app = FastAPI()#インスタンス化
@app.get("/")#ルーティング @はdecorator
async def index():
return {"message":"FastAPIだぞ"}
上のコメントでインスタンス化とルーティングを実装します。そしてFastAPIを起動します。
uvicorn main:app --reload
get("/")を使うことで、下の関数が処理されます。
APIドキュメントの自動生成(SwaggerUIの生成)
以下がSwaggerの説明です。
公式ドキュメント
SwaggerUI
以下の記事を見ればどんな感じかわかると思います。APIの仕様書を可視化してくれます。
FastAPIでは、これを自動生成してくれます。
サーバーを起動した状態で、http://127.0.0.1:8000/docs
で確認すると以下のように出てきます。
次にhttp://127.0.0.1:8000/redoc
としてみましょう。
Swaggerのフォーマットを生成してくれています。
パスパラメーター
ルーティングの設定で思ってもらえればいいです。
from fastapi import FastAPI
app = FastAPI()#インスタンス化
@app.get("/greeting")#ルーティングを変更
async def index():
return {"message":"FastAPIだぞ"}
そうするとhttp://127.0.0.1:8000/greeting
で表示されます。
ルーティングも変更してみていきます。
from fastapi import FastAPI
app = FastAPI()#インスタンス化
@app.get("/countries/{country_name}")#ルーティング @はdecorator
async def country(country_name):
return {"country_name":country_name}
サーバーを起動すると以下のようになります。"/countries/{country_name}のcountry_nameはAmericaにしてもbaseballにしても使えます。
from fastapi import FastAPI
app = FastAPI()#インスタンス化
@app.get("/countries/{country_name}")#ルーティング @はdecorator
async def country(country_name:int):#int追記
return {"country_name":country_name}
引数にintを追記しました。すると以下のように設定するといいです。
先ほどのSwaggerUIを確認してみます。
http://127.0.0.1:8000/docs
で調べてみました。
このように追記したりしました。ここでエラーなど確認できたりします。
型ヒントをベースにして、ドキュメントを作ってくれます。
RailsとNext.jsの開発だとSwaggerを組んだりしないといけないので、大変なんですね。😅
FastAPIすげーと思いました。😀
処理の順番
プログラムは、上から順番に処理がされます。
from fastapi import FastAPI
app = FastAPI()#インスタンス化
@app.get("/countries/japan")#ルーティング追記
async def country():
return {"message":'日本だー'}
@app.get("/countries/{country_name}")#ルーティング @はdecorator
async def country(country_name:str):
return {"country_name":country_name}
ルーティングをhttp://127.0.0.1:8000/countries/japan
になると、下のようになりますが、
処理を逆にすると、
入れ替えたのは、下の感じです。
from fastapi import FastAPI
app = FastAPI()#インスタンス化
@app.get("/countries/{country_name}")#ルーティング @はdecorator
async def country(country_name:str):
return {"country_name":country_name}
@app.get("/countries/japan")#ルーティング @はdecorator
async def country():
return {"message":'日本だー'}
クエリパラメーター
パスパラメーターはないけど、引数が設定されているのがクエリパラメーターです。
# クエリパラメーター
@app.get("/countries/")#ルーティング @はdecorator
async def country(country_name: str = 'japan',country_no: int =1)
return {
"country_name": country_name,
"country_no": country_no
}
URLをhttp://127.0.0.1:8000/countries/?country_name=England&country_no=3
で実行したら以下のように表示されます。
country_nameとcountry_noは任意で、変えられます。
クエリパラメーターとパスパラメーターの組み合わせ
from fastapi import FastAPI
app = FastAPI()#インスタンス化
# クエリパラメーター
country_nameからcity_nameに変えます。
@app.get("/countries/{country_name}")#ルーティング @はdecorator
async def country(country_name: str = 'japan',city_name: str = 'Tokyo'):#パスパラメーターはないけど、引数が設定されているのがクエリパラメーター
return {
"country_name": country_name,
"city_name": city_name
}
country_nameを日本からイギリスに変えてみます。
http://127.0.0.1:8000/countries/england?city_name=London
おすすめUdemy
本格的に学びたい場合はこの参考動画の方のUdemyをご覧ください。
公式ドキュメント
資料