56
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-08-12

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'より後ろ、その他のミドルウェアよりは前の位置に記述するように書かれているので、それに従っています。

56
44
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
56
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?