概要
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章が参考になりました。実践編も読みたいなと考えています。