静的ファイルが読み込めない。
DjangoのWebアプリをHerokuにデプロイしたのですが、DEBUG = False
にすると、静的ファイルが読み込めません。具体的には、デプロイは問題なく成功し、アプリもクラッシュしないのですが、status=500のServer Errorになってしまいます。(白い画面にServer Errorとだけ表示)
teratailやGoogleで調べて色々試したのですがWhitenoiseのエラーが解決できません。
ここ数日格闘していて、結局アプリのページの方は、アプリのディレクトリの下にstatic/アプリ名
を作ってcssやjsやimageを配置して読み込む形から、
css, js => BootstrapのCDNから直接読み込む形に変更。ちょっとしたものはテンプレート内に書き込む image => cloudinaryにアップロードして、urlを直接imgタグに書き込む形に変更
上記のように変更して、ListViewなどのWebページ本体はDEBUG = False
でも表示されるようになりました。
これでいいか...と思っていたのですが、肝心のWhitenoiseが解決していないのでadminページがServer Errorで表示されません。
adminページのCSSなどを読み込むにはどうしたらいいでしょうか。。
heroku にデプロイした後に、heroku run python manage.py collectstatic
は実行しています。
setting.py
python
1import os 2import dj_database_url 3 4BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 5 6DEBUG = False 7 8ALLOWED_HOSTS = ["*"] 9 10INSTALLED_APPS = [ 11 'app1.apps.AccountsConfig', 12 'django.contrib.admin', 13 'django.contrib.auth', 14 'django.contrib.contenttypes', 15 'django.contrib.sessions', 16 'django.contrib.messages', 17 'django.contrib.staticfiles', 18 'app2', 19 'bootstrap4', 20 'cloudinary', 21 'cloudinary_storage', 22] 23 24DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage' 25 26CLOUDINARY_STORAGE = { 27 "CLOUD_NAME": os.environ["CLOUD_NAME"], 28 "API_KEY": os.environ["CLOUD_API_KEY"], 29 "API_SECRET": os.environ["CLOUD_API_SECRET"], 30} 31 32MIDDLEWARE = [ 33 'django.middleware.security.SecurityMiddleware', 34 'whitenoise.middleware.WhiteNoiseMiddleware', 35 'django.contrib.sessions.middleware.SessionMiddleware', 36 'django.middleware.common.CommonMiddleware', 37 'django.middleware.csrf.CsrfViewMiddleware', 38 'django.contrib.auth.middleware.AuthenticationMiddleware', 39 'django.contrib.messages.middleware.MessageMiddleware', 40 'django.middleware.clickjacking.XFrameOptionsMiddleware', 41] 42 43ROOT_URLCONF = 'app_name.urls' 44 45TEMPLATES = [ 46 { 47 'BACKEND': 'django.template.backends.django.DjangoTemplates', 48 'DIRS': [os.path.join(BASE_DIR, 'templates')], 49 'APP_DIRS': True, 50 'OPTIONS': { 51 'context_processors': [ 52 'django.template.context_processors.debug', 53 'django.template.context_processors.request', 54 'django.contrib.auth.context_processors.auth', 55 'django.contrib.messages.context_processors.messages', 56 ], 57 }, 58 }, 59] 60 61MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 62MEDIA_URL = '/media/' 63 64WSGI_APPLICATION = 'app_name.wsgi.application' 65 66LOGIN_REDIRECT_URL = '/' 67 68DATABASES = { 69 'default': { 70 'ENGINE': 'django.db.backends.postgresql_psycopg2', 71 'NAME': 'name', 72 'USER': 'user', 73 'PASSWORD': '', 74 'HOST': 'localhost', 75 'PORT': '', 76 } 77} 78 79AUTH_PASSWORD_VALIDATORS = [ 80 { 81 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 82 }, 83 { 84 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 85 }, 86 { 87 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 88 }, 89 { 90 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 91 }, 92] 93 94LANGUAGE_CODE = 'ja-JP' 95 96TIME_ZONE = 'Asia/Tokyo' 97 98USE_I18N = True 99 100USE_L10N = True 101 102USE_TZ = True 103 104STATIC_URL = '/static/' 105 106STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles") 107 108try: 109 from .local_settings import * 110except ImportError: 111 pass 112 113if not DEBUG: 114 SECRET_KEY = os.environ["SECRET_KEY"] 115 import django_heroku 116 django_heroku.settings(locals()) 117 118db_form_env = dj_database_url.config(conn_max_age=600, ssl_require=True) 119DATABASES['default'].update(db_form_env) 120
ファイル構成
myapp |-- app1 |-- media |-- app2 | |-- migration | |-- templates | |-- app2 |-- myapp | |-- settings.py |-- templates | |-- registration |-- Procfile |-- manage.py |-- requirements.txt |-- runtime.txt
requirements.txt
beautifulsoup4==4.7.1 dj-database-url==0.5.0 Django==2.2.5 django-bootstrap4==1.0.1 django-heroku==0.3.1 docker==4.0.1 docutils==0.14 gunicorn==19.9.0 oauthlib==3.0.1 Pillow==5.4.1 psycopg2==2.8.2 pycodestyle==2.5.0 pycosat==0.6.3 pytz==2018.9 requests==2.21.0 requests-oauthlib==1.2.0 whitenoise==4.1.3 django-cloudinary-storage==0.2.3 cloudinary==1.17.0
heroku環境変数
CLOUDINARY_URL: ********** CLOUD_API_KEY: ********** CLOUD_API_SECRET: ********** CLOUD_NAME: ********** DATABASE_URL: ********** DISABLE_COLLECTSTATIC: 1 SECRET_KEY: **********
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。