Django 環境変数、設定まとめ

Django

概要

DjangoとHerokuでwebアプリを構築する際、環境変数の管理で手こずったので、現時点での最終形を記録しておきます。

django-environというパッケージで管理する方法もあるようですが、今回は使用しませんでした。

環境

  • Python 3.8.8
  • Django 3.2.2
  • Heroku

ディレクトリ構成(登場人物)

今回登場するファイルのディレクトリ構成です。

プロジェクト名「myproject」、アプリ名「myapp」として作成。

local_settings.pyのみ、デフォルトで存在しないと思うので、手動で作成し.gitignoreに追加してください。

myproject/
├ myapp/
│ ├ asgi.py
│ ├ local_settings.py
│ ├ settings.py
│ └ wsgi.py
└ manage.py

設定

アプリ内のファイル

settings.py

import os
from socket import gethostname

HOSTNAME = gethostname()
if 'local' in HOSTNAME:
    try:
        from .local_settings import *
    except ImportError:
        pass
    DEBUG = True
else:
    DEBUG = False
    SECRET_KEY = os.environ['SECRET_KEY']
    # メール
    EMAIL_HOST = os.environ['EMAIL_HOST']
    EMAIL_PORT = os.environ['EMAIL_PORT']
    EMAIL_HOST_USER = os.environ['EMAIL_HOST_USER']
    EMAIL_HOST_PASSWORD = os.environ['EMAIL_HOST_PASSWORD']
    EMAIL_USE_TLS = os.environ['EMAIL_USE_TLS']
    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    # ファイルシステム AWS
    AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
    AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
    AWS_STORAGE_BUCKET_NAME = os.environ['AWS_STORAGE_BUCKET_NAME']
    # 決済 PAY.JP
    PAYJP_PUBLIC = os.environ['PAYJP_PUBLIC']
    PAYJP_SECRET = os.environ['PAYJP_SECRET']
    # ソーシャルログイン Google
    SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = os.environ['PAYJP_PUBLIC']
    SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = os.environ['PAYJP_PUBLIC']

環境変数を設定する箇所を抜粋しました。項目も一部分になっています。

ローカル環境と本番環境を分ける条件は、ホスト名に'local'が含まれているかどうかとしました。

ローカル環境の場合は、後述のlocal_settings.pyをimportしています。

本番環境の場合は、Herokuで設定するConfig Varsをos.environ['変数名']で読み込む形としています。

コード記載の通り、シークレットキー、メール、ファイルシステム、決済サービス、ソーシャルログイン辺りが設定項目になるかと思います。

local_settings.py

SECRET_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

# メール
EMAIL_HOST = 'sv12345.xserver.jp'
EMAIL_PORT = 587 #(w/ SSL:465, w/o SSL:587)
EMAIL_HOST_USER = 'sample@sample.com'
EMAIL_HOST_PASSWORD = 'XXXXXXXXXXX'
EMAIL_USE_TLS = True
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

# AWS S3
AWS_ACCESS_KEY_ID = 'XXXXXXXXXXXXXXXXXXXX'
AWS_SECRET_ACCESS_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
AWS_STORAGE_BUCKET_NAME = 'myapp-dev'

# PAY.JP設定
PAYJP_PUBLIC = "pk_test_xxxxxxxxxxxxxxxxxxxxxxxx" # 公開鍵
PAYJP_SECRET = "sk_test_xxxxxxxxxxxxxxxxxxxxxxxx" # 秘密鍵

# ソーシャルログイン
SOCIAL_AUTH_FACEBOOK_KEY = '000000000000000'  # アプリID
SOCIAL_AUTH_FACEBOOK_SECRET = '00000000000000000000000000000000'  # app secret

続いて、local_settings.pyです。こちらで、git管理したくない(=外部に出したくない)変数を記載します。

メールサーバーはエックスサーバーを使用している形になっています(値はダミー)。

manage.py, wsgi.py, asgi.py

これらのファイルは、PythonにおいてWebサーバとWebアプリケーションが通信するためのインタフェースを定義するものです。ローカル環境ではmanage.py、本番環境ではwsgi.py, asgi.pyが用いられます。

上記で設定した変数を用いるために、下記コードが記載されていることを確認してください。おそらくデフォルトで記載されていると思います。

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings')

Herokuの設定

ブラウザアプリを使用している場合は、対象アプリのSettingsタブ内、Config Varsから設定してください。

ターミナルからは、

heroku run bash -app=myapp

直接アクセスしてから、

heroku config:set EMAIL_HOST='sv12345.xserver.jp'

のように設定してください。(参考:公式ドキュメント

Djangoアプリ内で変数を呼び出す

正しく設定されていれば、下記のように変数を呼び出すことができます。

from django.conf import settings

email_host = settings.EMAIL_HOST

参考書籍

こちらの書籍の第10章が参考になりました。実践編も読みたいなと考えています。

タイトルとURLをコピーしました