FastAPIとは|PythonによるWeb API開発入門

当ページには広告が含まれています。

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

こんな方におすすめ!
  • FastAPIの概要・できることについて詳しく知りたい
  • PythonとFastAPIを用いてAPIを実装する方法が知りたい
目次

【Python】FastAPIとは

FastAPIとは、Python3.6以降でAPIを構築するためのWebフレームワークです。

Pythonの人気なWebフレームワークにはDjangoやFlaskがありますが、近年FastAPIも非常に注目されています。FastAPIは、直感的でシンプルな構文からなり、新規開発を迅速に行うことができます。

【参考】FastAPI学習におすすめの教材

UdemyではFast APIの学習に適した動画教材が多数配信されています。Fast APIの基礎をはじめ、データベースやフロントアプリ(ReactやAngular等)連携という応用に至るまで幅広く学ぶことができます。

FastAPIの特徴

FastAPIの特徴として以下が挙げられます。

高速処理

FastAPIは、高性能なASGI(Asynchronous Server Gateway Interface)サーバーを使用して非常に高速なリクエスト処理を実現します。また非同期処理によるリクエストの同時処理も可能です。

型ヒントのサポート

Pythonの型ヒントを活用して、リクエストとレスポンスのデータ型の宣言ができます。これにより、入力値の検証や自動的なAPIドキュメンテーション生成が行われ、型ヒントに基づいた検証も可能です。

自動的なAPIドキュメンテーション生成

FastAPIは、APIのエンドポイント、リクエスト/レスポンスのデータ型、パラメータ、エラーハンドリングなどの情報を自動的にドキュメント化できます。

Swagger UI(Rest API開発フォーマット)と連携し、視覚的なAPIドキュメントが生成できます。

シンプルでPythonicな構文

FastAPIはPythonicな構文を採用しており、シンプルなコードでAPIを構築できます。関数のデコレータを使用してルーティングやリクエストハンドリングを行うため、学習曲線が緩やかです。

セキュリティ機能

FastAPIは、OAuth2、JWT(JSON Web Tokens)、CORS(Cross-Origin Resource Sharing)などのセキュリティ機能を組み込んでいます。安全なAPIを構築するための機能が豊富に提供されています。

【環境構築】Pythonライブラリのインストール

FastAPI利用に際して必要なPythonライブラリをインストールしましょう。

fastapi

FastAPIのアプリケーション実装に際して必要となるライブラリです。

pip install fastapi

uvicorn

サーバーとして稼働するためのライブラリです。

pip install "uvicorn[standard]"

【Python】FastAPI ひな型コードの実装

はじめに、最もシンプルなFastAPIコードを記述し、APIの実装イメージを確かめてみましょう。

Pythonプログラム作成

main.pyというPythonファイルを作成し、以下コードを記述します。

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def index():
    return {"message":"hello world"}

まず、FastAPIのインスタンスappを作成します。続いて@appにGETメソッドを割り当て、get("url")にアクセスがあった場合、関数index()を実行するという仕組みとします。

また、関数index()直前には同期処理syncまたは非同期処理asyncの指定ができます。

ローカルサーバーを起動 uvicorn

前述で作成したPythonプログラムを実行し、ローカルサーバー上でAPIの稼働確認を行います。

コマンド

ターミナル(MacOS)またはコマンドプロンプト(Windows)を起動し、前述で作成したmain.pyと同じディレクトリに移動します。そして、以下のコマンドを実行しましょう。

uvicorn main:app --reload

上記コマンドは、main.pyappインスタンス起動を意味します。--reloadは、コードを書き換えた際も再起動を自動でしてくれるオプションです。実行後、次のような出力結果が得られます。

INFO:     Will watch for changes in these directories: ['/Users/xxx/xxx/FastAPI']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [6053] using WatchFiles
INFO:     Started server process [6055]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

ブラウザ起動

uvicorn実行で得た出力記載のローカルサーバーのパス(http://127.0.0.1:8000)にアクセスすると、上図のように、Pythonファイルに記載した関数index()の実行結果が確認できます。

SwaggerUIを用いたAPI仕様確認

FastAPIには、APIドキュメンテーションの自動生成という便利な機能があります。

実装したAPIは、http://127.0.0.1:8000/docsにアクセスすることで確認できます。

【Python】FastAPIのパスパラメータ

パスパラメータ(Path Parameters)とは、FastAPIにおいて、URLの一部として情報を渡すための機能です。URL内の特定のセクションに値を埋め込むことで、APIエンドポイントの動作を制御したり、特定のデータを取得できるようになります。

パスパラメータの例

例えば、以下のようなURLがあるとします。

/content/{content_id}

このURLの{content_id}の部分がパスパラメータです。この部分に具体的な値を埋め込むことで、特定のコンテンツ情報を取得できます。

Pythonプログラム作成

FastAPIでは、パスパラメータを関数の引数として受け取ることができます。main.pyにパスパラメータを用いた関数を記述し、実際に動作確認してみましょう。

from fastapi import FastAPI

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

# パスパラメータを用いた関数作成
@app.get("/user/{user_name}")
async def user(user_name: str) -> dict:
    return {"UserName":user_name}

稼働確認

http://127.0.0.1:8000/user/TANAKA

uvicorn main:app --reloadでローカルサーバーを起動し、APIの稼働確認を行います。

上記パスでアクセスすると、UserNameTANAKAという値が取得できます。

【Python】FastAPIのパスパラメータ

クエリパラメータ(Query Parameters)とは、URLのクエリストリングとして渡されるキーと値のペアであり、APIエンドポイントに追加の情報を提供するために使用されます。

クエリパラメータの例

クエリパラメータは、APIエンドポイントのURLの後に?を付け、その後にキーと値のペアをkey=valueの形式で続けて記述します。複数のクエリパラメータを指定する場合は、&を使ってキーと値のペアを区切ります。

例えば、以下のようなURLがあるとします。

/users?name=John&age=30

このURLのnameageがそれぞれクエリパラメータに該当します。

Pythonプログラム作成

FastAPIでは、クエリパラメータを関数の引数として受け取ることができます。main.pyにクエリパラメータを用いた関数を記述し、実際に動作確認してみましょう。

from fastapi import FastAPI

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

# クエリパラメータを用いた関数作成
@app.get("/user/{user_name}")
async def user(user_name: str, age:int = None, address: str = None) -> dict:
    
    # 出力結果
    result = {
        "UserName": user_name,
        "Age": age,
        "Address": address,
        }
    
    return result

上記の例では、クエリパラメータとしてageおよびaddressを設定しました。クエリパラメータは@app.get()のパスの固定部分ではないため、オプショナルとしたり、デフォルト値を持たせることができます。

稼働確認

http://127.0.0.1:8000/user/Tanaka?age=30&address=Tokyo

uvicorn main:app --reloadでローカルサーバーを起動し、APIの稼働確認を行います。

上記パスでアクセスすると、クエリパラメータとして指定した値が取得できます。

【Python】FastAPIのリクエストボディ

リクエストボディとは、クライアントからAPIへ送られるデータです。レスポンスボディとは、APIがクライアントに送るデータを意味します。

POSTメソッド等を用いてクライアントからAPIにデータ送信する場合、リクエストボディ (request body) に指定します。以下、Pythonプログラムを用いた実装例を確認しましょう。

Pythonプログラム作成

FastAPIでリクエストボディを宣言する場合、Pydantic(BaseModel)というデータ処理モデルを用います。

from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional

# =============================================================
# リクエストボディ
# =============================================================

# BaseModelを継承したクラスとしてデータモデルを宣言
class Item(BaseModel):
    name: str
    price: int
    tax: Optional[float] = None

# =============================================================
# API
# =============================================================

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

# 関数作成
@app.post("/item/")
async def calculate_item(item: Item):
    result = {
        "ItemName":item.name,
        "Message":f'税込価格{int(item.price * item.tax)}円です。'
    }
    return result

稼働確認

http://127.0.0.1:8000/docs

自動ドキュメントとして生成されたスキーマを用いて前述で実装したAPIの稼働確認を行います。

ブラウザを開き、上記リンクにアクセスしましょう。

POSTメソッドの稼働確認は、対象APIの右上Try it outから実施できます。

上図のように、レスポンスボディを任意の値に書き換え、Execute押下します。

正常に処理が実行されると、HTTPレスポンス200とレスポンスボディが併せて確認できます。

最後に

この記事が気に入ったら
フォローしてね!

目次