2016-02-19 14 views
7

この質問は何度か聞かれるようですが、修正できません。ヘロクでDjangoの静的ファイルが見つからない(ホワイトニングあり)

DEBUG = Falseを使用して、生産時にdjangoアプリケーションをデプロイしました。私はallowed_hostを設定しました。 私は{% load static from staticfiles %}を使用して静的ファイルを読み込みました。

... 
`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>.` 

(メールで)

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を持って、このトレースバックを持って、私はheroku run python manage.py collectstatic --noinput を実行すると、すべてがOKと思われる:私は正確にHerokuのドキュメントで推薦した設定を書き

276 static files copied to '/app/annuaire/staticfiles', 276 post-processed.

誰でも私を助けるアイデアはありますか?

おかげ

EDIT:BASE_DIRため

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) 
+1

Djangoは唯一通常、その特定の関数を呼び出します=真。 DEBUG = Falseでローカルでアプリをテストし、 'collectstatic'を実行してから' runserver'を実行し、そのエラーが発生したかどうかを確認することをお勧めします。その特定のファイルをコミットしていない可能性がありますか? –

+0

申し訳ありません!デバッグがFalseの場合、正しいです! – vpoulain

+0

'/ app/annuaire/staticfiles'と同じであることを確認するために 'STATIC_ROOT'を印刷しましたか? – agconti

答えて

1

をお使いの設定がルートではなく、/プロジェクト名/フォルダにない場合は、二重のdirnameに必要:

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 
+0

ありがとう!私はそれを行ったが、それでも動作しません...私は主な質問の投稿で私のdjangoアプリツリーを編集しました。 – vpoulain

+0

私はcollectstaticのときに変わってしまいました。 '/ app/staticfiles'にコピーされた275個の静的ファイル、1個は修正されていない、276個の後処理されています。 'heroku bash:staticfilesはまだ空です... – vpoulain

+0

@vpoulain Herokuプロセスは独自の一時ファイルシステムで実行されるため、新しいファイルは他のプロセスでは見られません。 (https://devcenter.heroku.com/articles/dynos#ephemeral-filesystemを参照)。 'collectstatic'は、永続化されるファイルの初期プッシュ中に実行されなければなりません。 os.path.join(BASE_DIR、 'app'、 'static')、 )を使用するか、または静的フォルダをルート –

4

私はそれを得ました。私は追加する必要がありました python manage.py collectstatic --noinput;私のProcfileの Herokuの文書によると、collecticstaticが自動的に起動されます。 DEBUG=Falsehttps://devcenter.heroku.com/articles/django-assets

おかげ

+0

に移動する必要があると思うのですか? [ダッシュボード](https://id.heroku.com/login)を介してアプリケーション設定から環境変数DISABLE_COLLECTSTATICを削除してください。重要なのは次のとおりです。値を0にしないでください。このenv変数を完全に削除してください。そうすれば、 'Procfile'を編集する必要はありません。そして、すべてはうまくいくはずです(少なくとも彼らは私のために働いた!)。 クレジットは、[YunoJuno](http://tech.yunojuno.com/django-whitenoise-and-heroku-s-ephemeral-filesystem)にあります。 –

1

、どのようなオリジナル作品に使用することはもはや私のために動作しません。

MIDDLEWAREwhitenoisesettings.pyに設定して解決しました。ベストはSecurityMiddlewareのすぐ下にあるようにしてください。

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

`` `

docsによると、それは実際に最初の場所で有効にする必要があります。

0

問題は、HerokuのPythonアプリケーションが組み込みのWebサーバーを使用し、静的ファイルを提供しないことです。

whitenoiseのアプリを使用できます。この解決策は100%です。

は、たとえば、あなたはすでに静的ファイルを生成したとします

$ python manage.py collectstatic 

次はあなたがこれを実行する必要があります。

1)$ pip install whitenoise

2)は、文字列「ホワイトノイズ== 3.3を追加します。 0 "を入力してくださいrequirements.txt

3)のコードを追加してください。 PY

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

4)アプリ/ wsgi.py上記の回答に加えて

from whitenoise.django import DjangoWhiteNoise 
application = DjangoWhiteNoise(application) 
0

にこのコードを追加し、それはまた、あなたのように正しいSTATIC_ROOTを指定していないことをすることができhttps://docs.djangoproject.com/en/2.0/howto/static-files/#deployment

私の場合、解決策はこれを私の製造設定の最後に追加しています。

STATIC_ROOT = "/app/static/" 

静的なフォルダが次にあなたがそこに示されているパスが表示されます。この

heroku run python manage.py collectstatic 

を実行して、あなたのHerokuのである場所を知ります。

0

私のために働いた。 DEBUG = Falseの場合、私はあなたがDEBUGでそのエラーが出る可能性があることに困惑していたときに

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) 

Note

This helper function works only in debug mode and only if the given prefix is local (e.g. /static/) and not a URL (e.g. http://static.example.com/).

Also this helper function only serves the actual STATIC_ROOT folder; it doesn’t perform static files discovery like django.contrib.staticfiles.

関連する問題