Help us understand the problem. What is going on with this article?

DjangoアプリをHerokuにデプロイする時のエラー対処 whitenoise編

More than 1 year has passed since last update.

Djangogirlsなどでは、HerokuでDjangoアプリケーションを動かすために必要なパッケージのひとつとして、whitenoiseをインストールするように書かれています。

また、Djangoプロジェクトのwsgi.pyの最終行に、以下の内容を追加するように記載されています。

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しようとしても、必ずエラーを上げる処理が記載されていました。

whitenoise/django.py
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の最終行に追加した以下の記述は削除し、

wsgi.py
from whitenoise.django import DjangoWhiteNoise # この行は削除する

application = DjangoWhiteNoise(application) # この行も削除する

settings.pyのMIDDELWAREに'whitenoise.middleware.WhiteNoiseMiddleware'を追加します。

settings.py
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware', # この行を追加
    'django.contrib.sessions.middleware.SessionMiddleware',
# 以下略
]

なお、公式サイトを見ると、'django.middleware.security.SecurityMiddleware'より後ろ、その他のミドルウェアよりは前の位置に記述するように書かれているので、それに従っています。

http://whitenoise.evans.io/en/stable/django.html#django-middleware

ymhr1121
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away