THUMBS SHIFT→

このブログは主に親指シフトを用いて書かれています

django-herokuは何をやっているのか

django-herokuに頼らず自分で設定していきたいので、まずはdjango-herokuが何をやっているか確認していきます。

github.com

環境変数という語がでてきますが、これはherokuのダッシュボードもしくはCLIから割り当てられる変数で、(おそらく)セキュアです。os.environ[<key>]で取得できます。

49行目 にsettings関数が有りますね。この中を読んでいけばよさそうです。

まず引数ですが、configにはlocals()が渡されるので、つまりはsettings.pyの名前空間です。

53行目からはデータベースの設定のようです。

loggerを飛ばして見ていくと、75行目で大事な設定をしているのがわかります。

 config['DATABASES']['default'] = dj_database_url.config(conn_max_age=conn_max_age, ssl_require=True)

ここでdj_database_url.configという関数がでてきますが、これは環境変数の$DATABASE_URLをURLとか、パスワードとかの部分に分解して、djangoの設定に合うようにパースしてくれています。

これでデータベースは終わりです。

次に92行目からstaticfileの設定をしているようです。

95行目からは以下のようなコードです。

        config['STATIC_ROOT'] = os.path.join(config['BASE_DIR'], 'staticfiles')
        config['STATIC_URL'] = '/static/'


        # Ensure STATIC_ROOT exists.
        os.makedirs(config['STATIC_ROOT'], exist_ok=True)


        # Insert Whitenoise Middleware.
        try:
            config['MIDDLEWARE_CLASSES'] = tuple(['whitenoise.middleware.WhiteNoiseMiddleware'] + list(config['MIDDLEWARE_CLASSES']))
        except KeyError:
            config['MIDDLEWARE'] = tuple(['whitenoise.middleware.WhiteNoiseMiddleware'] + list(config['MIDDLEWARE']))


        # Enable GZip.
        config['STATICFILES_STORAGE'] = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

STATIC_ROOTとSTATIC_URLの設定をして、STATIC_ROOTのフォルダを作っていますね。

そのあとwhitenoise*1をmiddlewareに追加して、STATICFILES_STORAGEもwhitenoiseのものに差し替えています。

110行目からはALLOWED_HOSTSです。

    if allowed_hosts:
        logger.info('Applying Heroku ALLOWED_HOSTS configuration to Django settings.')
        config['ALLOWED_HOSTS'] = ['*']

あーよくない。ALLOWED_HOSTS=['*']にしているのでよくないです。なにが良くないのかはわかんないです。

テスト環境ならこれでも良いでしょうが、本番の場合はちゃんとホストするアドレスを指定しておきたいですね。

114行目からはロガーの設定なので割愛。

151行目以下でSECRET_KEYです。

    if secret_key:
        if 'SECRET_KEY' in os.environ:
            logger.info('Adding $SECRET_KEY to SECRET_KEY Django setting.')
            # Set the Django setting from the environment variable.
            config['SECRET_KEY'] = os.environ['SECRET_KEY']

環境変数から取ってきたSECRET_KEYをconfigに割り当てています。間違ってもSECRET_KEYを公開しないようにしましょう。

これをsettings.pyに持ってくればherokuにデプロイできます。

まとめると

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
MIDDLEWARE = [
    # ...
    'whitenoise.middleware.WhiteNoiseMiddleware',
    # ...
]


DATABASES = {
    'default': dj_database_url.config(conn_max_age=CONN_MAX_AGE, ssl_require=True)
}

SECRET_KEY = os.environ.get("SECRET_KEY")

のようになります。whitenoiseのインストールや、環境変数の割当を忘れないでください。

*1:nginxみたいなもの。静的ファイルを配信する。djangoが静的ファイルを配信するより高速