⚖️

【徹底解説】FastAPIの特徴と課題点

2022/10/11に公開約4,500字1件のコメント

はじめに

今回の記事では、PythonのWebフレームワーク「FastAPI」の特徴・課題点を簡潔に解説する。本記事の読者は主に以下のようなものを対象とする。

  • FastAPIを知らない人
  • FastAPIを実務で活用したい人
  • 技術選定でFastAPIを選ぶ理由を検討している人
  • PythonでWebアプリケーションを開発したい人
  • すでにDjangoやLaravelなどの他のフレームワークに着手していて、別のフレームワークに関する情報を収集している人

FastAPIとは

FastAPIとは、Djangoと同様にPythonのWebフレームワークである。主にWeb APIを開発するために利用される。

FastAPIの特徴

FastAPIの特徴は以下の通り。

  • Node.jsやGo言語に匹敵する高速なアプリケーションを開発できる。Pythonフレームワークの中では最も高速。
  • 少ないコード量で実装できる
  • 軽量
  • バグが少ない
  • 直感的に操作できる
  • 構造が簡単で、学習コストが低い(Flaskの影響を受けている)
  • 拡張性が高い。RESTとGraphQL両方の開発に対応している。RDB(SQLを使ったデータベース。SQLiteやMySQLなど。)だけではなくNoSQLの開発にもデフォルトで対応している
  • デフォルトでAPIドキュメントを出力できる。OpenAPIにも対応
  • Pythonに型定義を含められる
  • 非同期通信を簡単に実装できる
  • Pythonで開発されているので、機械学習との相性が抜群

今回の記事では、特にこれらの特徴に絞って徹底解説する。

  • 簡単にサーバを立ち上げられる
  • Pythonに型定義を含められる
  • 非同期通信を簡単に実装できる
  • 拡張性が高い
  • デフォルトでAPIドキュメントを出力できる
  • 機械学習との相性が抜群

それぞれ順番に解説する。

簡単にサーバを立ち上げられる

FastAPIでサーバを立ち上げる時、以下のコマンドを入力すれば環境構築は完了。

pip install fastapi "uvicorn[standard]"

次にmain.pyファイルを作って以下のプログラムをコピペする。

from typing import Union

from fastapi import FastAPI

app = FastAPI()


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


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

以下のコマンドを実行すればサーバが起動する。

uvicorn main:app --reload

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [28720]
INFO:     Started server process [28722]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

ブラウザのURLバーにhttp://localhost:8000/を入力すれば次のようなJSONレスポンスが返る。

{"Hello": "World"}

Pythonに型定義を含められる

FastAPIの最大の特徴は、Pythonに型定義を含められることである。FastAPIではpydanticライブラリでPythonの変数に型定義の機能を追加でき、バグを少なめに開発できるのだ。

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


# pydanticライブラリからBaseModelを使ってPythonで型定義ができる
# 型は自作できる(TypeScriptのtypeと類似している)
class Item(BaseModel):
    name: str
    price: float


# 型定義は変数の後ろに:をつけ、定義する型をその後に書く
@app.get("/")
def read_root(item: Item):
    return item.price

非同期通信を簡単に実装できる

FastAPIはデフォルトで非同期通信をサポートしている。それ故に少ないコード量でシンプルに、かつ効率的に非同期通信を実装できる。これは同じPythonのWebフレームワークであるFlaskやDjangoよりも遥かに優れているポイントである。(Djangoでは非同期通信のサポートが一応あるものの、FastAPIよりはシンプルに実装できない)

@app.post("/item/", response_model=Item)
async def create_item(item: Item):
    result = await some_code_running_in_background(item)
    return result

FastAPIでは上述のように簡単に予約語asyncawaitを関数内に組み込むことができる。もともとPythonが少ないコード量で様々な機能を実装できるように設計されているのもあり、FastAPIでは効率的にWeb開発を進められる。

拡張性が高い

FastAPIは拡張性が高いのも主な特徴の1つである。拡張性が高いとは、具体的にFastAPIでは以下のような開発に対応していることを意味する。

  • OpenAPIを使ったAPIドキュメントの自動化
  • RESTとGraphQL両方の開発に対応している点
  • 多種多様なデータベースとの連携が簡単(MongoDB等のNoSQLに対応している)

FastAPIにはこれらの開発に対応したライブラリが公式ドキュメントで丁寧に解説されているので、多様性に富んだ開発が得意である。

デフォルトでAPIドキュメントを出力できる

FastAPIではデフォルトでAPIドキュメントを出力できる。開発したAPIの仕様や挙動を逐一書く必要がなくなるので、これはAPI開発の効率化に大きく貢献する。

開発者サーバを立ち上げてhttp://localhost:8000/docsにアクセスすると以下のようにデフォルトでAPIドキュメントを主力してくれる。(画像引用は公式ドキュメントより)

更に、http://localhost:8000/redocで別の種類のAPIドキュメントを出力できる。

機械学習との相性が抜群

FastAPIはPythonで開発されているので、同じくPythonを使った機械学習との相性が抜群である。同じ言語で開発されているのでライブラリやプログラムの使い回しが簡単にできる。FastAPIはPythonで開発されているので、Pythonの基礎文法や知識、経験を簡単に転用できるのも魅力の1つ。

機械学習を使ったアプリケーションのバックエンドを開発したいなら、同じ言語で開発されているFastAPIを強く推奨する。同じ言語でアプリケーションを開発すると学習コストが下がったり、知識や経験を転用できて一石二鳥だ

FastAPIの課題点

FastAPIをWeb開発で使う上での課題点は次の2つになる。

  • エコシステムが未発達
  • 必要最低限の機能しか搭載されていない

エコシステムが未発達

FastAPIは2018年にリリースされて5年しか経過されていないので、同じWebフレームワークであるDjangoやFlaskと比較してもエコシステムが未発達である。そのため、日本語の情報がそこまで多くないのでときには英語の情報にアクセスして開発を進める必要がある

圧倒的な情報量を担保するならDjangoやRailsのような歴史の長いフレームワークを使ったほうが賢明だろう。

必要最低限の機能しか搭載されていない

FastAPIには必要最低限の機能しか搭載されていないので、手動で別途新しい機能だけではなく認証などアプリケーション開発に必須の機能を追加する必要がある。故に、短期間で開発を進めたいプログラマーやウェブアプリケーションの仕組みを十分に把握できない初心者にはFastAPIは不向きである可能性が高い。

まとめ

今回の記事ではFastAPIの主な特徴と課題点を徹底解説した。

【FastAPIの主な特徴】

  • 簡単にサーバを立ち上げられる
  • Pythonに型定義を含められる
  • 非同期通信を簡単に実装できる
  • 拡張性が高い
  • デフォルトでAPIドキュメントを出力できる
  • 機械学習との相性が抜群

【FastAPIの課題点】

  • エコシステムが未発達
  • 必要最低限の機能しか搭載されていない

本記事が技術選定でFastAPIを選ぶ契機になったり、理由を検討する上で最適な記事になったりすれば幸いである。

余談

今回の記事は技術選定の理由を予め検討するためのメモを記す目的で執筆した。技術選定でDjangoを使う理由は以下の記事で詳細に解説しているので、よければ一読してほしい。

https://zenn.dev/nameless_sn/articles/why_django_development

参考サイト

https://fastapi.tiangolo.com/features/

https://medium.com/featurepreneur/why-fastapi-69fb172756b7

GitHubで編集を提案

Discussion

fastapi-usersというパッケージを追加すれば、user認証機能は簡単に追加可能です。
また、fastapi-adminというdjango-adminライクなパッケージや、fastapi-debug-toolbarといったデバッグ用パッケージもあります。

ログインするとコメントできます