web-dev-qa-db-ja.com

DEBUG = Falseの設定によりDjango St​​atic Files Accessが失敗するのはなぜですか?

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設定に関して、何か足りないものはありますか?

299
nemesisfixx

デバッグをオフにすると、Djangoは静的ファイルを処理しなくなります-本番Webサーバー(Apacheなど)がそれを処理します。

291
Marek Sapota

ローカルで静的にサーバーを使用する必要がある場合(デバッグなしでテストする場合など)、安全でないモードでdevserverを実行できます。

manage.py runserver --insecure
415

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など)がそれを処理する必要があります。

25
Johnny Zhao

開発で静的サーブビューを使用している場合は、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'})
)
16
j_syk

実際には、プロダクション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())
11
Robin Winslow

ジョニーの answer は素晴らしいですが、そこに記述されている行を追加するだけではまだうまくいきませんでした。その答えに基づいて、実際に私のために働いたステップはどこですか:

  1. インストール WhiteNoise 説明どおり:

    pip install WhiteNoise
    
  2. STATIC_ROOT変数を作成し、settings.pyMIDDLEWARE変数に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
    
  3. 次に、ジョニーの答えで説明されているようにwsgi.pyファイルを変更します。

    #wsgi.py
    from Django.core.wsgi import get_wsgi_application
    from whitenoise.Django import DjangoWhiteNoise
    
    application = get_wsgi_application()
    application = DjangoWhiteNoise(application)
    
  4. その後、変更をサーバーにデプロイします(gitまたは使用するものは何でも)。

  5. 最後に、サーバー上のmanage.pyから collectstatic オプションを実行します。これにより、すべてのファイルが静的フォルダーから前に指定したSTATIC_ROOTディレクトリーにコピーされます。

    $ python manage.py collectstatic
    

    そのような要素を含むstaticfilesという名前の新しいフォルダーが表示されます。

これらの手順を実行すると、サーバーを実行できるようになり、運用モードで静的ファイルを表示できるようになります。

更新:バージョン<4の場合、 changelogWSGI_APPLICATION = 'projectName.wsgi.application'ファイルでsettings.pyを宣言する必要がなくなったことを示します。

10
DarkCygnus

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の場合、静的ファイルとメディアファイルの両方がアクセス可能になりました。
それが役に立てば幸い :)

7
stathoula

プロジェクト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 }), ]
6
Sergey Luchko

これをさまざまな方法でデバッグできます。これが私のアプローチです。

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

4
Conrado

同様の問題が発生しました:DEBUG = Falseでherokuに静的ファイルをロードしていません。


ソリューション

production.py ::

STATIC_ROOT = 'static'

展開され、正常に動作しました(Robin Winslowが説明したようにdj_staticを使用しています)。

1
gabriel

最も安全ではありませんが、ソースコードを変更できます。 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:情報はテストのみに使用する必要があります

0
Natuto

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')} ),
        )
0
be_good_do_good

私のプロジェクト/urls.pyに以下の変更を加えましたが、うまくいきました

この行を追加:Django.conf.urls import urlから

urlpatternsにurl(r '^ media /(?P。*)$'、serve、{'document_root':settings.MEDIA_ROOT、})を追加します。

0
Namrata Sharma