Djangoを主力として使用してアプリを構築しています。これまでのところ、指定されたdb設定、構成された静的ディレクトリ、URL、ビューなどはすべて順調です。しかし、自分の美しくてカスタムの404.htmlおよび500.htmlページをレンダリングしたい瞬間に問題がこっそりと始まりました。
カスタムエラー処理に関するドキュメントを読み、必要な構成をUrlsConfで設定し、対応するビューを作成し、404.htmlと500.htmlをアプリのテンプレートディレクトリ(settings.pyでも指定)に追加しました。
しかし、ドキュメントではyou can actually view custom error views until Debug is Off
と書かれているので、私のものをテストするためにそれをオフにしました。
カスタム404.htmlの表示に失敗するだけでなく(実際には読み込まれますが、各エラーページにはグラフィックエラーメッセージが含まれているため、エラーページのソースは読み込まれますが、他には何も読み込まれません!) CSSやJavascriptもリンクされていません!
一般に、DEBUG = False
を設定すると、すべてのビューが読み込まれますが、リンクされたコンテンツ(CSS、Javascript、画像など)は読み込まれません!何が起こっていますか?静的ファイルとDEBUG
設定に関して、何か足りないものはありますか?
デバッグをオフにすると、Djangoは静的ファイルを処理しなくなります-本番Webサーバー(Apacheなど)がそれを処理します。
ローカルで静的にサーバーを使用する必要がある場合(デバッグなしでテストする場合など)、安全でないモードでdevserverを実行できます。
manage.py runserver --insecure
WhiteNoise を使用して、実稼働環境で静的ファイルを提供できます。
インストール:
pip install WhiteNoise
そして、wsgi.pyファイルをこれに変更します:
from Django.core.wsgi import get_wsgi_application
from whitenoise.Django import DjangoWhiteNoise
application = get_wsgi_application()
application = DjangoWhiteNoise(application)
そして、あなたは行ってもいいです!
Handlebar Creative Blog へのクレジット。
しかし、実稼働環境で静的ファイルをこの方法で提供することは実際にはお勧めできません。実稼働Webサーバー(nginxなど)がそれを処理する必要があります。
開発で静的サーブビューを使用している場合は、DEBUG = Trueにする必要があります。
警告
これは、DEBUGがTrueの場合にのみ機能します。
これは、このビューが非常に非効率的で、おそらく安全でないためです。これはローカル開発のみを目的としており、本番環境では決して使用しないでください。
編集:404と500のテンプレートをテストするためだけにいくつかのURLを追加することができます。URLでdirect_to_templateの汎用ビューを使用するだけです。
from Django.views.generic.simple import direct_to_template
urlpatterns = patterns('',
('^404testing/$', direct_to_template, {'template': '404.html'})
)
実際には、プロダクションDjangoアプリで、DEBUG=True
なしで安全に静的ファイルを提供できます。
Django自体を使用するのではなく、WSGIファイルで dj_static を使用します(- github ):
# requirements.txt:
...
dj-static==0.0.6
# YOURAPP/settings.py:
...
STATIC_ROOT = 'staticdir'
STATIC_URL = '/staticpath/'
# YOURAPP/wsgi.py:
...
from Django.core.wsgi import get_wsgi_application
from dj_static import Cling
application = Cling(get_wsgi_application())
ジョニーの answer は素晴らしいですが、そこに記述されている行を追加するだけではまだうまくいきませんでした。その答えに基づいて、実際に私のために働いたステップはどこですか:
インストール WhiteNoise 説明どおり:
pip install WhiteNoise
STATIC_ROOT
変数を作成し、settings.py
のMIDDLEWARE
変数にWhiteNoiseを追加します。
#settings.py
MIDDLEWARE = [
'Django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware', #add whitenoise
'Django.contrib.sessions.middleware.SessionMiddleware',
...
]
#...
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') ##specify static root
次に、ジョニーの答えで説明されているようにwsgi.py
ファイルを変更します。
#wsgi.py
from Django.core.wsgi import get_wsgi_application
from whitenoise.Django import DjangoWhiteNoise
application = get_wsgi_application()
application = DjangoWhiteNoise(application)
その後、変更をサーバーにデプロイします(gitまたは使用するものは何でも)。
最後に、サーバー上のmanage.py
から collectstatic
オプションを実行します。これにより、すべてのファイルが静的フォルダーから前に指定したSTATIC_ROOT
ディレクトリーにコピーされます。
$ python manage.py collectstatic
そのような要素を含むstaticfiles
という名前の新しいフォルダーが表示されます。
これらの手順を実行すると、サーバーを実行できるようになり、運用モードで静的ファイルを表示できるようになります。
更新:バージョン<4の場合、 changelog はWSGI_APPLICATION = 'projectName.wsgi.application'
ファイルでsettings.py
を宣言する必要がなくなったことを示します。
Urls.pyに次の行を追加しました。
from Django.views.static import serve
これらの2つのURLをurlpatternsに追加します。
url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),
url(r'^static/(?P<path>.*)$', serve,{'document_root': settings.STATIC_ROOT}),
dEBUG = FALSEの場合、静的ファイルとメディアファイルの両方がアクセス可能になりました。
それが役に立てば幸い :)
プロジェクトurls.pyを開いて、このifステートメントを見つけます。
if settings.DEBUG:
urlpatterns += patterns(
'Django.views.static',
(r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )
Settings.DEBUGをTrueに変更すると、常に機能します。しかし、プロジェクトが深刻なものである場合は、上記の他のソリューションを検討する必要があります。
if True:
urlpatterns += patterns(
'Django.views.static',
(r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )
Django 1.10では、次のように記述できます。
urlpatterns += [ url(r'^media/(?P<path>.*)$', serve, { 'document_root': settings.MEDIA_ROOT, }), url(r'^static/(?P<path>.*)$', serve, { 'document_root': settings.STATIC_ROOT }), ]
これをさまざまな方法でデバッグできます。これが私のアプローチです。
localsettings.py:
DEBUG = False
DEBUG404 = True
urls.py:
from Django.conf import settings
import os
if settings.DEBUG404:
urlpatterns += patterns('',
(r'^static/(?P<path>.*)$', 'Django.views.static.serve',
{'document_root': os.path.join(os.path.dirname(__file__), 'static')} ),
)
必ずドキュメントを読んでください;)
https://docs.djangoproject.com/en/2.0/howto/static-files/#limited-use-to-debug-true
同様の問題が発生しました:DEBUG = Falseでherokuに静的ファイルをロードしていません。
ソリューション
production.py
::
STATIC_ROOT = 'static'
展開され、正常に動作しました(Robin Winslowが説明したようにdj_staticを使用しています)。
最も安全ではありませんが、ソースコードを変更できます。 Python/2.7/site-packages/Django/conf/urls/static.py
に移動します
次に、次のように編集します。
if settings.DEBUG or (prefix and '://' in prefix):
したがって、settings.debug==False
がコードに影響を与えない場合は、実行後にpython manage.py runserver --runserver
を試して静的ファイルを実行してください。
NOTE:情報はテストのみに使用する必要があります
Url()への文字列ビュー引数のサポートは廃止され、Django 1.10で削除されます
私の解決策は、上記のConradoの解決策をほんの少し修正することです。
from Django.conf import settings
import os
from Django.views.static import serve as staticserve
if settings.DEBUG404:
urlpatterns += patterns('',
(r'^static/(?P<path>.*)$', staticserve,
{'document_root': os.path.join(os.path.dirname(__file__), 'static')} ),
)
私のプロジェクト/urls.pyに以下の変更を加えましたが、うまくいきました
この行を追加:Django.conf.urls import urlから
urlpatternsにurl(r '^ media /(?P。*)$'、serve、{'document_root':settings.MEDIA_ROOT、})を追加します。