DjangoでAPIを実装する（前半）

# はじめに
この記事は、DjangoでAPIを実装する手順について記載します
My備忘録を兼ねています

# 目次
1. 仮想環境の作成
1. Djangoでアプリ作成
1. MySQLへの接続切替
1. 環境変数を別ファイルで管理

# 実装手順

## 1. 仮想環境の作成

ルートディレクトリに仮想環境を作成するため、以下のコマンドを実行
```
% python3 -m venv venv
```

作成した仮想環境には以下のコマンドで入ることができます
```
% source venv/bin/activate
↑ 開発PCがUNIX系の場合

% venv\Scripts\activate
↑ 開発PCがWindowsの場合
```

仮想環境から出るときは以下のコマンドを実行
```
(venv) % deactivate
```

**(注意)```pip install```でパッケージをインストールするときは仮想環境に入って実行しましょう**


## 2. Djangoでアプリ作成

仮想環境に入ります
```
% source venv/bin/activate
↑ 開発PCがUNIX系の場合

% venv\Scripts\activate
↑ 開発PCがWindowsの場合
```

仮想環境でdjangoパッケージをインストール
```
(venv) % pip install django
```

以下のコマンドを実行して、Djangoプロジェクトを作成します
```
(venv) % django-admin startproject config .
```

apiアプリケーションを追加します
```
(venv) % python manage.py startapp api
```

ここまで完了したら、正常に作成されたか確認します
以下のコマンドを実行して`http://127.0.0.1:8000/`にアクセス
```
(venv) % python manage.py runserver
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108396/3e3b0904-1f11-5555-29c3-e45ca68c53ba.png)

画面が表示されたら、正常にプロジェクトが作成されていることになります

## 3. MySQLへの接続切替

DjangoはデフォルトでSQLiteに接続されているので、ローカルのMySQLに切り替えます
事前に下記の準備をしてください（詳細については割愛します）
- 接続先のデータベースを作成
- 接続用のユーザを作成
- 作成ユーザの権限設定

MySQLに接続するため、MySQLクライアントパッケージをインストールします
```
(venv) % pip install mysqlclient
```

データベースへの接続情報は```/config/settings.py```に記載されています
この設定ファイルを修正します
```/config/settings.py
DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': BASE_DIR / 'db.sqlite3',
        'ENGINE': 'django.db.backends.mysql', # MySQLに接続
        'NAME': 'db',                         # 作成したデータベース名
        'USER': 'user',                       # 作成した接続用のユーザ名
        'PASSWORD': 'password',               # ユーザのパスワード
    }
}
```

接続先をMySQLに変更したら、Djangoの機能でデータベースを構築します
```
(venv) % python manage.py makemigrations
(venv) % python manage.py migrate
```

SQLiteは使用しないので、デフォルトで作成されているルートディレクトリの```db.sqlite3```は削除してください

最後に正常に起動するか確認します
```
(venv) % python manage.py runserver
```

## 4. 環境変数を別ファイルで管理

データベースへの接続情報など公開したくない情報があると思います
このような情報は別ファイル（以後、環境ファイル）で管理して公開しないようにします

まずは必要なパッケージをインストールします
```
(venv) % pip install django-environ
```

ルートディレクトリに```.env```（環境ファイル）を作成します
作成したら以下のように記載してください（値は必要に応じて変更してください）
```.env
SECRET_KEY='xxxx'

DEBUG=TRUE

DB_ENGINE='django.db.backends.mysql'
DB_NAME='db'
DB_USER='user'
DB_PASSWORD='password'
```

SECRET_KEYのxxxxには、```/config/settings.py```のSECRET_KEYの値を入力します
このSECRET_KEYも公開してはいけない情報なので、環境ファイルで管理します

DEBUGは開発・本番環境で切り替えることが多いです
ですので、DEBUGのオンオフも環境ファイルで管理します

また、データベースの接続情報も環境ファイルで管理します

**(注意)環境ファイルにスペースが入るとエラーの元になるので、スペースは入れないようにしてください**


次に```/config/settings.py```を編集します
```/config/settings.py
import environ # 追加
import os      # 追加

~(省略)~

# 環境ファイルの読み込み
env = environ.Env()                           # 追加
env.read_env(os.path.join(BASE_DIR, '.env'))  # 追加

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env('SECRET_KEY') # 変更

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = env.bool('DEBUG')      # 変更

~(省略)~

# Database
# https://docs.djangoproject.com/en/5.0/ref/settings/#databases

DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': BASE_DIR / 'db.sqlite3',
        'ENGINE': env('DB_ENGINE'),     # 変更
        'NAME': env('DB_NAME'),         # 変更
        'USER': env('DB_USER'),         # 変更
        'PASSWORD': env('DB_PASSWORD'), # 変更
    }
}
```

作成した環境ファイルと読み込んで、```env('環境変数')```で読み出すことができます

ここまで完了したら正常に起動するか確認します
```
(venv) % python manage.py runserver
```

最後に```.gitignore```でプッシュ対象外を記載して完了です
```.gitignore
.env
venv
```

これで環境ファイルがGitHubにプッシュされることはなくなりました
また、venvもプッシュする必要がないので対象外にします


# 最後に
ここまででDjangoでAPIを実装する準備は整いました
次回から本格的にAPIの実装部分を記載します
（次回は未作成です。作成次第リンク張ります）