環境
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のバージョンの互換性が保たれていないこと。 解決策としては、両方のモジュールのバージョンを最新版にする。