🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1620閲覧

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

hajifu

総合スコア88

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/09/27 15:13

編集2019/09/30 15:00

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

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: **********

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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

DISABLE_COLLECTSTATIC

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

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

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

python

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

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

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

投稿2019/09/30 14:56

hajifu

総合スコア88

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問