質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.92%

Djangoをherokuにデプロイした際のWhitenoiseのエラー?

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,044

score 88

静的ファイルが読み込めない。

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

import os
import dj_database_url

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

DEBUG = False

ALLOWED_HOSTS = ["*"]

INSTALLED_APPS = [
    'app1.apps.AccountsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app2',
    'bootstrap4',
    'cloudinary',
    'cloudinary_storage',
]

DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'

CLOUDINARY_STORAGE = {
     "CLOUD_NAME": os.environ["CLOUD_NAME"],
     "API_KEY": os.environ["CLOUD_API_KEY"],
     "API_SECRET": os.environ["CLOUD_API_SECRET"],
}

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',
]

ROOT_URLCONF = 'app_name.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

WSGI_APPLICATION = 'app_name.wsgi.application'

LOGIN_REDIRECT_URL = '/'

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'name',
        'USER': 'user',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '',
    }
}

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

LANGUAGE_CODE = 'ja-JP'

TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_L10N = True

USE_TZ = True

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")

try:
    from .local_settings import *
except ImportError:
    pass

if not DEBUG:
    SECRET_KEY = os.environ["SECRET_KEY"]
    import django_heroku
    django_heroku.settings(locals())

db_form_env = dj_database_url.config(conn_max_age=600, ssl_require=True)
DATABASES['default'].update(db_form_env)

ファイル構成

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: **********
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

アプリ作り直してデプロイしなおしたら解決しました。。
質問の状態から変更した部分といえば

DISABLE_COLLECTSTATIC


を設定せずにデプロイしたくらいなのですが、質問したやつの前の時はそれでエラーになっていたような気がするし、解決はしましたがまたいつ同じ状態になるかわかりません・・・。
なのでもし今後アプリケーションにcssやjsファイルを置きたくなったときにどうすればいいのかわかっていません。またHTML内に直接書いてもいいのですが、初心者なのでそれってやり方として適当なのかわかりません(汚いサイト的なラベルを張られないかなとか)

collectstatic はローカルでもheroku上でも実行しませんでした。(DISABLE_COLLECTSTATICを設定していないのでデプロイ時に自動で実行された)

whitenoiseをバージョン3に変えて、wsgi.pyでapplicationをラップする形や、また4に戻してcollectstaticを実行したりとか、色々出てくる対処法をあれこれするうちに環境がぐちゃぐちゃ?になったのか?

STATICFILES_DIRS =(
    os.path.join(BASE_DIR, 'static'),
)


とかも、Qiita記事などでは皆さん書いているのですが、(わかってないなりに)僕の場合は必要ない、とした判断が結果的には正しかったりして、これのあるなしの意味もよく分かっていません。

一応、解決済みにはせずに、もっと抜本的な解決を解説してくださる方がいればその時に解決済みにしようと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る