FastAPIでユーザ認証機能を実装する方法【環境構築編】

FastAPIを使用し、Basic認証を実現するための方法を紹介します。
今回は環境構築編となります。
認証機能に必要なデータベースの構築から、開発をスムーズに進めるための最低限の環境構築を行います。

環境構築

全体のディレクトリ構成

example_fastapi/
 ├ src/
 │ └ Dockerfile
 │ └ Pipfile
 │ └ app/
 │   └ main.py
 │   └ lib/
 │     └ database.py
 │   └ example/
 │     └ view.py
 │     └ models.py
 │     └ schemes.py
 ├ docker-compose.yml
 └ nginx/
   └ default.conf

docker-composeの作成

まず、FastAPIを動作させるためのDockerコンテナと、認証情報を保存しておくためのデータベースコンテナを準備します。
各コンテナをスムーズに連携できるように、docker-composeを使用して環境を準備します。
今回はデータベースにMySQLを使用します。

  • docker-compose.yml
version: '2'
services:
  mysql:
    image: mysql:5.7
    volumes:
      - mysql:/var/lib/mysql
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
      MYSQL_DATABASE: example
      MYSQL_USER: example
      MYSQL_PASSWORD: password
  api:
    depends_on:
      - mysql
    build: src
    links:
      - mysql
    expose:
      - 8000
    volumes:
      - ./src:/var/www/app
    command: "run reload"
  nginx:
    image: nginx
    depends_on:
      - api
    ports:
      - 80:80
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
volumes:
  mysql:
    driver: local

データベースの作成

docker-composeを実行すると自動的にデータベースが作成されます。
テーブルもFastAPIから自動的に作成されるため、細かい設定が必要なければ事前に作成しておく必要はありません。

プロジェクトの作成

FastAPIは自動的にプロジェクトを作成する仕組みがないため、自分でファイルを構築していきます。
まず、FastAPIを動作させるための最低限のファイルを作成します。
機能の実装に関しては次章で行います。

初期ディレクトリ構成

example_fastapi/
 └ src/
   └ app/
     └ main.py

アプリ実行用ファイルの作成

  • src/app/main.py
from fastapi import FastAPI

app = FastAPI()

Pipenvファイルの作成

Pythonのライブラリを管理するために、今回はPipenvを使用します。
Pipenvを使用してパッケージ管理するためにPipfileを作成します。

  • src/Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]
flake8 = "*"

[packages]
click = "==7.0"
fastapi = "==0.45.0"
h11 = "==0.9.0"
httptools = "==0.0.13"
pydantic = "==1.3"
starlette = "==0.12.9"
uvicorn = "==0.11.1"
uvloop = "==0.14.0"
websockets = "==8.1"
sqlalchemy = "*"
pymysql = "*"
passlib = "*"
bcrypt = "*"
email-validator = "*"

[requires]
python_version = "3.7"

[scripts]
start = "uvicorn app.main:app --host 0.0.0.0"
reload = "uvicorn app.main:app --host 0.0.0.0 --reload"

Dockerファイルの作成

Dockerコンテナをビルドするためのファイルを作成します。

  • src/Dockerfile
FROM python:3.7

LABEL maintainer "example <example@example.com>"

# Prepare environments
RUN pip install pipenv
COPY Pipfile /var/www/app/Pipfile
WORKDIR /var/www/app
RUN pipenv install

# Copy this project
COPY . /var/www/app

# Configration
EXPOSE 8000

# Execute
ENTRYPOINT ["pipenv"]
CMD ["run", "start"]

Nginxの設定ファイル作成

FastAPIをプロキシするためのNginxの設定ファイルを作成します。

  • nginx/default.conf
upstream backend {
    server api:8000;
}
server {
    listen 80;
    server_name _;

    location / {
        proxy_pass http://backend;
    }

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;
}

アプリを実行

docker-composeは開発モード(ファイルが編集されたら自動で再起動する)で動作するようにしているので、docker-composeでアプリを実行します。

実行

docker-compose build
dokcer-compose up

動作確認

ブラウザから [http://localhost/docs] にアクセスし、OpenAPIの画面が表示されるか確認します。
OpenAPIの画面が表示されれば無事動作完了です。

終わりに

以上で最低限のFastAPIの環境構築は完了です。
次章から、認証機能の実装を書いていきます。

【認証機能編】FastAPIでユーザ認証機能を実装する方法