😊

FastAPI 備忘録

2021/05/13に公開

FastAPI 備忘録

以前は flask をベースとしたconnexionを使って Web アプリ(API)を作っていたりしたのだが、FastAPIが人気なことや connexion の開発者が connexion にあまり熱を入れなくなってきているので移行を考える。

FastAPI とは

以下、抜粋。
それ以上をここで説明する意味も無いので以下、省略

FastAPI は、Pythonの標準である型ヒントに基づいてPython 3.6 以降でAPI を構築するための、モダンで、高速(高パフォーマンス)な、Web フレームワークです。

Gunicorn を使った起動

FastAPI のインストールは難しい話ではない。
pip install fastapi とかすれば良いだけなのでこれも割愛。
起動には uvicorn を使った例が公式ドキュメントに記載されているが
uvicornのサイトにも Gunicorn の利用を促しているような記述があるので FastAPI を利用する際には Gunicorn による起動とする。

Gunicorn による起動

Gunicorn は、20.1.0 以降は ASGI App を動かす事がデフォルトになっている。
従って、 WSGI 向けのオプションを付けずに実行すると起動はするが、アクセスすると
Internal Server Error になって実質、動かない。
よって、以下のように起動する。

gunicorn -k uvicorn.workers.UvicornWorker --bind "0.0.0.0:8000" --log-level debug main:app

Gunicorn 設定

なお、Gunicorn の起動設定はgunicorn.conf.pyで行うことができる。
これは起動時にコンソールを眺めているとこのような記述と共に
既存の設定(無ければデフォルト)が表示されるので分かる。

[2021-05-13 09:58:51 +0900] [18548] [DEBUG] Current configuration:
  config: ./gunicorn.conf.py

コマンドオプションで渡すこともできるが
特に worker_class オプションを記憶しておいて毎度、打ち込むのは骨が折れるので
予め設定しておくとよい。

bind = "0.0.0.0:8000"
worker_class = "uvicorn.workers.UvicornWorker"
loglevel = "debug"
accesslog = None
access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'
proc_name = "Application Name"

ここで proc_nameを設定して表示するためには setproctitle module が必要。
以下のようにしておくとよい。

 pip install setproctitle

これで以後は以下のように実行するだけで最初のコマンドと同じような動作になる。
必要に応じて --reloadを付けると更新される度に reload されるが、本番でそれをするのはあまりオススメしない。

 gunicorn --log-level debug main:app

ディレクトリ構造

GitHubで編集を提案

Discussion