4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FastAPIの使い方(Python初心者やプログラミング初心者におすすめ)

Last updated at Posted at 2024-07-23

FastAPIとは

Pythonのフレームワークで、高速でAPIを構築するためのフレームワークです。

参考動画

Pythonのバージョン

Python3のバージョンです。

特徴

  • 初学者向けのフレームワーク
  • わかりやすい書き方
  • 公式ドキュメントが豊富
  • 自動ドキュメントを作る機能(Swaggerと連携取れている)
  • バリデーション機能の実装簡単
  • 型安全
  • 高速

初学者がPythonのAPI開発ならFastAPIがベストです。

発展的に学ぶ場合は以下のことを知っているといいみたいです。

タイプヒントを用いたバリデーション、非同期処理、オリジン間リソース共有(CORS)、GraphQL、WebSocketsなどです。

Flaskと似ている

Flaskと書き方が似ているので、やったことある方はやりやすいと思います。

python3.5から導入された型ヒント(type hints)

FastAPIの型ヒント(type hints)は、関数の引数と戻り値のデータ型を指定するためのPythonの注釈機能です。
まずは簡単に消費税から計算します。

type_hints.py
# 型ヒント
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円と出力

ここで注意点で、型ヒントは注釈に過ぎないので、以下のように間違えた実装してもエラーにならないです。

type_hints.py
# 型ヒント
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起動

まずは下のコードを見てください。

main.py
from fastapi import FastAPI

app = FastAPI()#インスタンス化

@app.get("/")#ルーティング @はdecorator
async def index():
    return {"message":"FastAPIだぞ"}

上のコメントでインスタンス化とルーティングを実装します。そしてFastAPIを起動します。

uvicorn main:app --reload

http://127.0.0.1:8000にアクセスすると

スクリーンショット 2024-07-22 18.15.02.png

get("/")を使うことで、下の関数が処理されます。

APIドキュメントの自動生成(SwaggerUIの生成)

以下がSwaggerの説明です。

  • 公式ドキュメント

  • SwaggerUI

以下の記事を見ればどんな感じかわかると思います。APIの仕様書を可視化してくれます。

FastAPIでは、これを自動生成してくれます。
サーバーを起動した状態で、http://127.0.0.1:8000/docsで確認すると以下のように出てきます。

スクリーンショット 2024-07-22 18.31.34.png

次にhttp://127.0.0.1:8000/redocとしてみましょう。
Swaggerのフォーマットを生成してくれています。

スクリーンショット 2024-07-22 18.33.58.png

パスパラメーター

ルーティングの設定で思ってもらえればいいです。

main.py
from fastapi import FastAPI

app = FastAPI()#インスタンス化

@app.get("/greeting")#ルーティングを変更
async def index():
    return {"message":"FastAPIだぞ"}

そうするとhttp://127.0.0.1:8000/greetingで表示されます。

スクリーンショット 2024-07-22 18.43.50.png

ルーティングも変更してみていきます。

main.py
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にしても使えます。

スクリーンショット 2024-07-22 23.07.38.png

main.py
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を追記しました。すると以下のように設定するといいです。

スクリーンショット 2024-07-22 23.10.07.png

先ほどのSwaggerUIを確認してみます。
http://127.0.0.1:8000/docs
で調べてみました。

スクリーンショット 2024-07-22 23.11.26.png

スクリーンショット 2024-07-22 23.12.05.png

このように追記したりしました。ここでエラーなど確認できたりします。
型ヒントをベースにして、ドキュメントを作ってくれます。
RailsとNext.jsの開発だとSwaggerを組んだりしないといけないので、大変なんですね。😅
FastAPIすげーと思いました。😀

処理の順番

プログラムは、上から順番に処理がされます。

main.py
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
になると、下のようになりますが、
スクリーンショット 2024-07-24 1.06.35.png

処理を逆にすると、

スクリーンショット 2024-07-24 1.07.52.png

入れ替えたのは、下の感じです。

main.py
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":'日本だー'}

クエリパラメーター

パスパラメーターはないけど、引数が設定されているのがクエリパラメーターです。

main.py
# クエリパラメーター
@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
で実行したら以下のように表示されます。

スクリーンショット 2024-07-24 1.51.25.png

country_nameとcountry_noは任意で、変えられます。

クエリパラメーターとパスパラメーターの組み合わせ

main.py
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
    }

スクリーンショット 2024-07-24 2.01.25.png

country_nameを日本からイギリスに変えてみます。
http://127.0.0.1:8000/countries/england?city_name=London

スクリーンショット 2024-07-24 2.04.15.png

おすすめUdemy

本格的に学びたい場合はこの参考動画の方のUdemyをご覧ください。

公式ドキュメント

資料

4
6
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
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?