web-dev-qa-db-ja.com

Django静的ファイルがHerokuで見つかりません(ホワイトノイズあり)

この質問は何度か聞かれるようですが、修正できません。

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)
13
vpoulain

わかった。 Procfileにpython manage.py collectstatic --noinput;を追加する必要がありました。Herokuのドキュメントによると、collecticstaticは自動的にトリガーされます。 https:// devcenter。 heroku.com/articles/Django-assets

ありがとう

5
vpoulain

DEBUG=Falseを使用すると、オリジナルが機能するために使用するものが機能しなくなります。

ただし、settings.pywhitenoiseMIDDLEWAREを有効にすることによる修正で解決しました。 SecurityMiddlewareのすぐ下にあるのが最善です。

MIDDLEWARE = [
    'Django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware', # add this line
    #Other middleware...
]

`` `

docs によると、実際には最初に有効にする必要があります。

2
Zac Kwan

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
1
Meska

私は最終的に問題を理解するまで数時間苦労しました。私の意見の主な問題は、 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を他のミドルウェアの上に配置する必要があります。

1
lmiguelvargasf

私も同じ問題を抱えています。問題を見つける最も簡単な方法は、

heroku run ls staticfiles/images

画像がファイルがあるべきディレクトリにある場合。これにより、そのディレクトリ内のすべてのファイルのリストが表示されます。

私が知ったように、それはファイル拡張子のケースの問題でした。ファイルの拡張子は.JPGで、テンプレートで拡張子.jpgを付けて参照しました。

0
user11760977

私にとっては次のように働いた。

settings.py

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

urls.py

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のような静的ファイルの検出は実行しません。

0
Kishor Pawar

上記の回答に加えて、 https://docs.djangoproject)で説明されているように、正しいSTATIC_ROOTを指定していない可能性もあります。 .com/en/2.0/howto/static-files /#deployment

私にとっての解決策は、これを本番環境のsettings.pyの最後に追加することでした。

STATIC_ROOT = "/app/static/"

静的フォルダーがherokuのどこにあるかを知るには、これを実行します

heroku run python manage.py collectstatic

次に、そこに表示されているパスが表示されます。

0
Truc

問題は、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)
0
I. S.