Djangogirlsなどでは、HerokuでDjangoアプリケーションを動かすために必要なパッケージのひとつとして、whitenoiseをインストールするように書かれています。
また、Djangoプロジェクトのwsgi.pyの最終行に、以下の内容を追加するように記載されています。
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)
ただし、2018年8月現在の最新バージョンであるwhitenoise 4.0をインストールした場合、wsgy.pyに上記のような編集を行うと、Djangoアプリケーションが以下のようなエラーで起動しなくなります。
$ python manage.py runserver
(略)
from whitenoise.django import DjangoWhiteNoise
File "(略)/lib/python3.7/site-packages/whitenoise/django.py", line 2, in <module>
'\n\n'
ImportError:
Your WhiteNoise configuration is incompatible with WhiteNoise v4.0
This can be fixed by following the upgrade instructions at:
http://whitenoise.evans.io/en/stable/changelog.html#v4-0
(略)
django.core.exceptions.ImproperlyConfigured: WSGI application
'(Djangoプロジェクト名).wsgi.application' could not be loaded;
Error importing module.
whitenoiseのdjango.pyの中身を見てみると、whitenoise.djangoから何かをimportしようとしても、必ずエラーを上げる処理が記載されていました。
raise ImportError(
'\n\n'
'Your WhiteNoise configuration is incompatible with WhiteNoise v4.0\n'
'This can be fixed by following the upgrade instructions at:\n'
'http://whitenoise.evans.io/en/stable/changelog.html#v4-0\n'
'\n')
##対処方法
###その1 古いバージョンのwhitenoiseを使う
インストール済みのwhitenoise 4.0はアンインストールして、
$ pip uninstall whitenoise
代わりに古いwhitenoiseをインストールします。
ここでは4.0より、1バージョン古い3.3.1にしています。
$ pip install whitenoise == 3.3.1
###その2 wsgi.pyではなく、settings.pyを編集する
whitenoiseは4.0からDjangoでの取り扱い方が変わったようです。
wsgi.pyの最終行に追加した以下の記述は削除し、
from whitenoise.django import DjangoWhiteNoise # この行は削除する
application = DjangoWhiteNoise(application) # この行も削除する
settings.pyのMIDDELWAREに'whitenoise.middleware.WhiteNoiseMiddleware'
を追加します。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware', # この行を追加
'django.contrib.sessions.middleware.SessionMiddleware',
# 以下略
]
なお、公式サイトを見ると、'django.middleware.security.SecurityMiddleware'
より後ろ、その他のミドルウェアよりは前の位置に記述するように書かれているので、それに従っています。