【python】webフレームワーク「FastAPI」の環境構築 – FastAPI入門

Logo - ©Sebastián Ramírez 2018 MIT License

はじめに

今回はpythonの高速webフレームワークであるFastAPIの環境構築を行う。環境構築にはdockerを利用し、エディタとしてVisual Studio Codeを利用する。

FastAPIとは

pythonではDjangoやFlaskといったwebフレームワークが有名であるが、一般的にこれらはNode.jsと比較して遅いと言われている。その欠点を改善したのが、FastAPIとなる。ざっくりいうと、従来のフレームワークは同期式(WSGI)であったのに対し、FastAPIは非同期式(ASGI)であるため、待ち時間を有効活用できるため高速に動作するということらしい。

その他、フレームワークの比較は公式サイトで言及されているので、そちらを参照のこと。

VSCode (Visual Studio Code)

python開発でよくつわかれるエディタにはVisual Studio Code(VSCode)とatomが存在するが、atomが開発停止となるため本サイトではVSCodeを利用していく。

インストール

インストールには、環境に合わせたインストーラを以下からダウンロードして実行する。

  • VSCode公式

    windows , linux , Macに対応。
    Linux版(Ubuntu)について、2022年からapt-keyが非推奨(Deprecated APT key management utility)となるため、代替手段が周知されるまでは素直にdebパッケージをダウンロードしてインストールするのが良さそう。ちなみに、snapによるインストールは楽そうに見えるが、日本語入力できないという事象が発生する可能性があるため注意が必要。

VSCodeインストール後は、このみで以下の機能追加や設定を実施する。

設定内容 方法
日本語化 プラグイン「Japanese Language Pack for Visual Studio Code」
python プラグイン「python」
markdown プラグイン「Markdown All in One」
UML プラグイン「PlantUML」
HTMLサーバ プラグイン「Live Server」
ステータスバー「Go Liveから起動」
ミニマップの非表示 「ファイル – ユーザ設定 – 設定」から「テキストエディター – ミニマップ」で、ミニマップを非表示にする。

VSCodeでよく使いそうなショートカット・機能。

ショートカット 機能
grep 「SHIFT」+「Ctl」+「F」
ターミナル起動 「Ctl」+「`」
矩形選択 「SHIFT」+「Alt」
コマンドパレット 「SHIFT」+「Ctl」+「P」
ソートコマンド:「sort …」
diffコマンド:「compare …」
目次作成コマンド:「Markdown All in One:Create Table Of Contents」
目次更新コマンド:「Markdown All in One:Update Table Of Contents」

docker

python環境を簡単に作成+使い回しできるように、dockerでサーバを構築する。以下はLinux(ubuntu)での環境構築。

dockerとは

dockerは、VMwareやVirtual Boxのような仮想マシン実行環境。dockerを利用するメリットは、仮想マシンのOSのインストールや設定等を簡単にスクリプト化・自動化できる点。

このため、一つ仮想マシンを作ってしまえば、以降はコマンド一つで同じ環境が作成できるため、新規参入した開発者が環境構築で1日潰れるということもなくなる。また、dockerイメージをそのまま本番環境とにデプロイすることも可能。

イメージとコンテナ

一般にOSのインストールでは、ISOファイルをDVD等に焼いて、開発マシンにインストールすることになる。dockerではそれぞれ、以下のように呼ばれる。

  • 「ISOファイル」に該当するもの … イメージ
  • 「開発マシン」に該当するもの … コンテナ

compose.yamlとDockerfile

OSインストールや設定は、compose.yamlとDockerfileというファイルにスクリプト化する。Dockerfileでは、使用するイメージ(OS)の指定や初期設定を指定し、compose.yamlではコンテナ(仮想マシン)とホストマシンとの関連性を定義する。

環境構築

環境構築の手順を以下に示す。

docker

docker公式に従う。

# 前提ソフトのインストール
sudo apt update
sudo apt-get install ca-certificates curl gnupg lsb-release

# dockerのキーを追加
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# dockerリポジトリの追加
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# dockerのインストール
sudo apt update
sudo apt install docker-ce

docker-compose(ver2系)

dockerを使う上での便利ツール。docker v20.10.13 以降はdocker composeコマンド(Ver2系)を利用可能。docker-compose(ver1系)は非推奨となっている。

sudo apt install docker-compose-plugin

FastAPIイメージ作成

フォルダ構成

以下のdockerFile及びcompose.yamlを利用して、fastapiのイメージを作成する。そのうちコンテナが増えていくと思うので(mysql等)、Dockerfileはフォルダを切って配置している。

root
┣ compose.yaml
┣ app
┃ ┗ main.py
┗ docker_config
  ┗ python
    ┗ Dockerfile

compose.yaml

「build」でDockerfileの場所を指定したり、container_nameでコンテナ名を指定している。

services:
  fastapi:
    build: ./docker_config/python
    volumes:
      - ./app:/app
    ports:
      - 8000:80
    container_name: fastapi

上記で作成したイメージは以下の動作となる。

  • ホストマシンの「app」フォルダは、仮想マシンの「/app」フォルダと同期する
  • fastapiコンテナのwebサービスは、ブラウザから以下のURLでアクセスできる

Dockerfile

fastapiの公式イメージを利用する。開発用に、ファイルを更新すると自動でリロードする設定を追加。

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.6
CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "80"]

main.py

webサイトのメインページ。アクセスするとjson「{"Hello": "World"}」を返す。

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: str = None):
    return {"item_id": item_id, "q": q}

FastAPIコンテナ実行

上記フォルダ構成を準備したら、compose.yamlのフォルダに移動してコマンドを実行する。

起動(イメージとコンテナの作成)

以下コマンドを実行後、ブラウザからURLにアクセスして、「{"Hello": "World"}」が表示されればOK。

cd root
sudo docker compose up -d

終了

コンテナを落として終了する。

cd root
sudo docker compose down --volumes --remove-orphans

イメージを作り直したい場合、名前が競合するので以下で削除してから「compose up」する。

sudo docker compose down --rmi all --volumes --remove-orphans

その他のdockerコマンド

よく使うコマンドは以下の通り。

コマンド 内容
search イメージを検索(web)
pull イメージを取得(web)
images イメージ一覧(local)
run イメージからコンテナを生成して起動
start 停止中のコンテナを起動
ps -a コンテナ一覧
exec コンテナ内でコマンド実行
例)sudo docker exec -it (コンテナ名) /bin/bash
cp ホストとコンテナ間でのファイルコピー
stop コンテナを停止
commit コンテナをイメージ化
rm コンテナを削除
rmi イメージを削除
タイトルとURLをコピーしました