Chapter 05

FastAPIのインストール

smithonisan
smithonisan
2021.08.15に更新

前章で準備したDockerイメージを利用して、実際にPython環境の準備およびFastAPIのインストールを行います。

poetryによるPython環境のセットアップ

ここで、簡単に poetry について触れておきましょう。

poetry はPythonのパッケージ管理を行ってくれるツールです。RubyにおけるBundlerやJavaにおけるMavenのように、パッケージ同士の依存関係を解決してくれます。
Pythonでは、最もプリミティブなパッケージ管理として pip が有名ですが、 poetry では pip が行わないパッケージ同士の依存関係の解決や、lockファイルを利用したバージョン固定、Pythonの仮想環境管理など、より高機能でモダンなバージョン管理が行えます。

初回は、 poetry において依存関係を管理する pyproject.toml が存在しません。 poetry を使ってFastAPIをインストールし、 pyproject.toml を作成していきましょう。

以下のコマンドを実行します。

shell
$ docker-compose run \
  --entrypoint "poetry init \
    --name demo-app \
    --dependency fastapi \
    --dependency uvicorn[standard]" \
  demo-app

上記のコマンドは少し複雑ですが、先程作ったDockerコンテナ(demo-app)の中で、 poetry init コマンドを実行しています。引数として、 fastapi と、ASGIサーバーである uvicorn をインストールする依存パッケージとして指定しています。

このコマンドにより、インタラクティブなダイアログが始まります。
Authorのパートのみ n の入力が必要ですが、それ以外はすべてEnterで進めていけば問題ありません。

最後に、 pyproject.toml ファイルのプレビューが出てきますが、以下のようになっていれば成功です。(バージョンは本書執筆時のものですが、実行時の最新のものが表示されているはずです。)

This command will guide you through creating your pyproject.toml config.

Version [0.1.0]:
Description []:
Author [None, n to skip]:  n
License []:
Compatible Python versions [^3.9]:

Using version ^0.65.1 for fastapi
Using version ^0.13.4 for uvicorn
Would you like to define your main dependencies interactively? (yes/no) [yes]
You can specify a package in the following forms:
  - A single name (requests)
  - A name and a constraint (requests@^2.23.0)
  - A git url (git+https://github.com/python-poetry/poetry.git)
  - A git url with a revision (git+https://github.com/python-poetry/poetry.git#develop)
  - A file path (../my-package/my-package.whl)
  - A directory (../my-package/)
  - A url (https://example.com/packages/my-package-0.1.0.tar.gz)

Search for package to add (or leave blank to continue):

Would you like to define your development dependencies interactively? (yes/no) [yes]
Search for package to add (or leave blank to continue):

Generated file

[tool.poetry]
name = "demo-app"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]

[tool.poetry.dependencies]
python = "^3.9"
fastapi = "^0.65.1"
uvicorn = {extras = ["standard"], version = "^0.13.4"}

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"


Do you confirm generation? (yes/no) [yes]

FastAPIのインストール

上記でFastAPIを依存パッケージに含む、poetryの定義ファイルを作成しました。
以下のコマンドでインストールを行います。

shell
$ docker-compose run --entrypoint "poetry install" demo-app

依存パッケージのダウンロードが始まり、インストールが完了します。

Creating virtualenv demo-app in /src/.venv
Updating dependencies
Resolving dependencies... (15.2s)

Writing lock file

Package operations: 13 installs, 0 updates, 0 removals

  • Installing typing-extensions (3.10.0.0)
  • Installing click (7.1.2)
  • Installing h11 (0.12.0)
  • Installing httptools (0.1.2)
  • Installing pydantic (1.8.2)
  • Installing python-dotenv (0.17.1)
  • Installing pyyaml (5.4.1)
  • Installing starlette (0.14.2)
  • Installing uvloop (0.15.2)
  • Installing watchgod (0.7)
  • Installing websockets (8.1)
  • Installing fastapi (0.65.1)
  • Installing uvicorn (0.13.4)

上記のインストールが完了した際に、プロジェクトディレクトリ直下に poetry.lock ファイルが作成されていることを確認します。

上記2コマンドにより、 pyproject.tomlpoetry.lock ファイルが準備できました。これにより、Dockerイメージを一から作った際は、FastAPIを含んだPython環境をイメージの中に含めることができるようになりました。新しいPythonパッケージを追加した場合などは以下のようにイメージを再ビルドするだけで、 pyproject.toml に含まれている全てのパッケージをインストールすることができます。

shell
$ docker-compose build --no-cache

ローカルの開発環境の整備

上記の方法で、実際のAPIに利用する poetry 環境の整備が完了しました。
ローカルで開発される場合はPyCharmやVSCodeのようなIDEを利用されている方も多いかと思います。dockerコンテナの中のPython環境は、ローカル環境と異なるパス定義となるため、そのままではパッケージの参照ができず、エラーの下線が表示されてしまいます。

PyCharmの場合、Professional版であればdocker-composeインタプリタが利用可能です。

https://pleiades.io/help/pycharm/using-docker-compose-as-a-remote-interpreter.html