Effective Computer Science - 頂は礎の上に -

新しい技術の多くは基礎的な技術の上に成り立っています。激動の技術変化に耐えうる体系知識の習得を目的に「基礎と実践の架け橋」となるサイトを目指します。

【Django × Heroku × WhiteNoise】設定でエラーが出る場合の対処方法

環境

Heroku × Django × WhiteNoise
で以下のような設定が済んでいる場合

対象ファイル:setting.py

INSTALLED_APPS = [
    'whitenoise.runserver_nostatic',
    ...,
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware', 
    'whitenoise.middleware.WhiteNoiseMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

# 静的ファイル配信用のディレクトリで、URLの一部になる。
STATIC_URL = '/static/'

# アプリケーションに紐づかない静的ファイルの置き場
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

# 静的ファイルの配信元。
# collectstaticコマンドで静的ファイルを集約する際のコピー先でもある。
# 「STATICFILES_DIRES」とは別のディレクトリを指定する必要がある。
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

# Simplified static file serving.
# https://warehouse.python.org/project/whitenoise/
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

エラー内容

mw_instance = middleware(handler)<br>
TypeError: __init__() takes 1 positional argument but 2 were given

詳細

File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/util.py", line 350, in import_app
__import__(module)
File "/app/ebdjango/wsgi.py", line 16, in <module>
application = get_wsgi_application()
File "/app/.heroku/python/lib/python3.6/site-packages/django/core/wsgi.py", line 13, in get_wsgi_application
return WSGIHandler()
File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/wsgi.py", line 135, in __init__
self.load_middleware()
File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 37, in load_middleware
mw_instance = middleware(handler)
TypeError: __init__() takes 1 positional argument but 2 were given

原因と解決策

原因は、Djangoのバージョンとwhitenoiseのバージョンの互換性が保たれていないこと。 解決策としては、両方のモジュールのバージョンを最新版にする。

参考