この質問は何度か聞かれるようですが、修正できません。
DjangoアプリをDEBUG = False
で本番環境にデプロイしました。allowed_Host
を設定しました。{% load static from staticfiles %}
を使用して静的ファイルをロードしました。提案された設定を正確に記述します。 Heroku docによる:
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(PROJECT_ROOT, 'static'),
)
STATICFILES_STORAGE = 'whitenoise.Django.GzipManifestStaticFilesStorage'
しかし、私はエラー500を受け取りました。そしてこのトレースバックを(メールで)受け取りました
...
`cache_name = self.clean_name(self.hashed_name(name))
File "/app/.heroku/python/lib/python3.5/site- packages/Django/contrib/staticfiles/storage.py", line 94, in hashed_name (clean_name, self))
...
ValueError: The file ‘app/css/font.css’ could not be found with <whitenoise.Django.GzipManifestStaticFilesStorage object at 0x7febf600a7f0>.`
heroku run python manage.py collectstatic --noinput
を実行すると、すべて問題ないようです。
276 static files copied to '/app/annuaire/staticfiles', 276 post-processed.
誰かが私を助けるためのアイデアを持っていますか?
ありがとう
編集:
annuaire
|-- /annuaire
|-- -- /settings.py
|-- /app
|-- -- /static/...`
wsgi.py
from Django.core.wsgi import get_wsgi_application
from whitenoise.Django import DjangoWhiteNoise
application = get_wsgi_application()
application = DjangoWhiteNoise(application)
わかった。 Procfileにpython manage.py collectstatic --noinput;を追加する必要がありました。Herokuのドキュメントによると、collecticstatic
は自動的にトリガーされます。 https:// devcenter。 heroku.com/articles/Django-assets
ありがとう
DEBUG=False
を使用すると、オリジナルが機能するために使用するものが機能しなくなります。
ただし、settings.py
のwhitenoise
でMIDDLEWARE
を有効にすることによる修正で解決しました。 SecurityMiddleware
のすぐ下にあるのが最善です。
MIDDLEWARE = [
'Django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware', # add this line
#Other middleware...
]
`` `
docs によると、実際には最初に有効にする必要があります。
bASE_DIRの場合、設定がルートではなく/ projectname /フォルダーにある場合は、dirnameを2つにする必要があります。
settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
STATICFILES_STORAGE = 'whitenoise.Django.GzipManifestStaticFilesStorage'
# for /static/root/favicon.ico
WHITENOISE_ROOT = os.path.join(BASE_DIR, 'staticfiles', 'root')
template.html
{% load staticfiles %}
<link rel="stylesheet" href="{% static "app/css/font.css" %}">
この例のアプリツリー:
annuaire
|-- /annuaire
|-- -- /settings.py
|-- /app
|-- /static/app/css/font.css
私は最終的に問題を理解するまで数時間苦労しました。私の意見の主な問題は、 Herokuの公式ドキュメント では、新しいMIDDLEWARE
設定の代わりに、非推奨のMIDDLEWARE_CLASSES
を使用する古いスタイルのミドルウェアを使用していることです。
ホワイトノイズバージョン4以降では、Django(wsgi.pyの編集を含む)のWSGI統合オプションが削除されました。代わりに、settings.pyのミドルウェアリストにWhiteNoiseを追加し、 wsgi.pyからのWhiteNoiseへの参照( ドキュメント から)
次の構成は魅力のように機能しました。
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
MIDDLEWARE = [
'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',
'Django.middleware.security.SecurityMiddleware',
# the next line of code is the one that solved my problems
'whitenoise.middleware.WhiteNoiseMiddleware',
]
また、ドキュメントから次の注に注意してください。
ミドルウェアリストの一番上に最高の優先順位を与える必要があることを示唆する他のサードパーティミドルウェアを見つけるかもしれません。何が起こっているのかを正確に理解していない限り、このアドバイスを無視し、常にWhiteNoiseMiddlewareを他のミドルウェアの上に配置する必要があります。
私も同じ問題を抱えています。問題を見つける最も簡単な方法は、
heroku run ls staticfiles/images
画像がファイルがあるべきディレクトリにある場合。これにより、そのディレクトリ内のすべてのファイルのリストが表示されます。
私が知ったように、それはファイル拡張子のケースの問題でした。ファイルの拡張子は.JPG
で、テンプレートで拡張子.jpg
を付けて参照しました。
私にとっては次のように働いた。
DEBUG = True
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') #this is not used
# Add static folder to STATIC_DIRS
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
from Django.conf.urls.static import static
from Django.conf import settings
urlpatterns = [
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
注意
このヘルパー関数は、デバッグモードでのみ機能し、指定されたプレフィックスがローカル(例:/ static /)であり、URL(例: http://static.example.com/ )ではない場合にのみ機能します。
また、このヘルパー関数は実際のSTATIC_ROOTフォルダーのみを提供します。 Django.contrib.staticfilesのような静的ファイルの検出は実行しません。
私にとっての解決策は、これを本番環境のsettings.pyの最後に追加することでした。
STATIC_ROOT = "/app/static/"
静的フォルダーがherokuのどこにあるかを知るには、これを実行します
heroku run python manage.py collectstatic
次に、そこに表示されているパスが表示されます。
問題は、HerokuのPythonアプリケーションが組み込みのWebサーバーを使用し、静的ファイルを提供しないことです。
whitenoise のアプリを使用できます。この実用的なソリューションは100%です。
次に、静的ファイルをすでに生成しているとします。
$ python manage.py collectstatic
次に、これを行う必要があります。
1)$ pip install whitenoise
2)requirements.txtに文字列 "whitenoise == 3.3.0"を追加します
3)settings.pyにコードを追加します
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
4)このコードをapp/wsgi.pyに追加します
from whitenoise.Django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)