DEBUG = Falseに設定すると、django Static Files Accessが失敗するのはなぜですか?


356

私の主力製品として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設定に関して何か不足していますか?


どのようにホスティングしていますか?テストサーバーを備えたローカルマシン?
j_syk

テストサーバーを備えたローカルマシン。基本的に、存在しないページへのアクセスや実行時エラーの発生などのシナリオをローカルでシミュレートして、カスタムエラー処理がどのように機能するかを確認したいのですが、静的コンテンツが読み込まれません。
nemesisfixx

このようにサーバーレベルで実行することも、urlpatternを追加してDjangoレベルで処理することもできます。私は同じ問題について以下の質問を見つけました。stackoverflow.com/questions/6405173/...
パンカジアナンド

回答:


353

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


3
これは実際に私の好奇心を解決するので、今ではそれが理にかなっており、必要に応じて、Apacheで実際に対処することができます。自分の設定の問題だと思っていました。ありがとう
nemesisfixx

5
この回答はとても役に立ちました。他の誰かが私の同じ状況にある場合に備えて(nonrel djangoを使用するアプリにGoogle App Engineを使用):app.yamlを更新することを忘れないでください。
Lyndsey Ferguson

3
ハンドラー:-url:/ static static_dir:static
Lyndsey Ferguson

475

静的にローカルでサーバー処理する必要がある場合(デバッグなしのテストなど)、非セキュアモードでdevserverを実行できます。

manage.py runserver --insecure

6
このフラグは機能しますが、collectstaticフォルダーからのコンテンツは提供しません
ハウイー

5
それは魔法です。ありがとうございます、あなたはヒーローです。この回答は、django自体とは別の方法を使用して静的に対応する必要なく問題を解決するため、受け入れられた回答とマージする必要があります。
Depado 2014

1
これで十分だった。ただし、ベストプラクティスは、環境変数を使用して、開発環境と本番環境、およびデバッグトグルを区別することです。
Neeraj Gupta


9
これについて何がそれほど安全でないか誰かが誰かに教えてもらえますか
Kavi Vaidya '20

36

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の功績。

ただし、本番環境では、この方法で静的ファイルを提供することはお勧めできません。(nginxのような)運用Webサーバーがそれを処理します。


1
面白そうに聞こえwgsi.pyますが、ファイルにその行を追加するだけでは機能しませんでした。リンクしたドキュメントは、WhiteNoiseを使用するための他の指示を提供しているようです。他の方法を試し、ここで更新します。
DarkCygnus

これが最終的に私を解決策に導いたものだったので、+ 1。実際に機能させるために行った追加の手順を含めて、回答を追加しました。
DarkCygnus

manage.py runserver --insecureうまくいきませんでした。しかし、これはそうです。
ジヨン

3
WhiteNoiseリリース4.0では、構成が変更されていることに注意してください。これらの行をwsgi.pyに追加しないでください。代わりに、'whitenoise.middleware.WhiteNoiseMiddleware'ミドルウェアに追加してください。変更ログのリリースノートを参照
Doug Harris

なぜ*推奨されないのですか?私は何年にもわたっていくつかのサイトで使用してきました。HerokuでもDjangoテンプレートで使用しています。
Omar Gonzalez

33

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


それが管理パネルCSSをロードしていないとき??
サイサィアディープ

はい。動作する唯一のもの!ありがとう。
DrGeneral

驚くばかり!STATIC_ROOTとmanage.py collectstaticを設定することを忘れないでください。
DomingoR

2
今日で置き換えるurl(re_path(
Leopd

19

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

1
どのようにして静的ファイルを本番環境で提供しますか?NVM、見たところです。ありがとう。

特定のディレクトリをホストするようにWebサーバーを設定します。最も一般的には、ApacheまたはNginxを使用します。ドキュメントは少し入ります。
j_syk

@j_sykに感謝します。uが提案するものと同様の他のエラー以外のメカニズムを介して404.htmlと500.htmlを表示するこのアプローチをすでに試しました。しかし、テストサーバーで実行しているだけで、本番環境でページを正しくレンダリングすることがまったく不可能であるかどうかを知りたいと思っていました。デバッグがオフのときのApacheへの静的ファイル処理の委任によって解決されます。貢献してくれてありがとう。
nemesisfixx 2011

@mcnemesis何が起こるか正確にはわかりませんが、TEMPLATE_DEBUG = False、およびDEBUG = Trueに設定してみてください。あなたはかなりの誤差をオフにした場合、それは代わりに500分の404のテンプレートに行く場合、私はよく分からない
j_syk

予想通り、これを行っても肯定的な結果は得られませんでした。
nemesisfixx 2011

17

ジョニーの答えは素晴らしいですが、そこに記載されている行を追加するだけではまだうまくいきませんでした。その答えに基づいて、実際に私のために働いた手順は次のとおりです:

  1. 説明に従ってWhiteNoiseをインストールします。

    pip install WhiteNoise
  2. 作成STATIC_ROOT変数を、あなたにホワイトノイズを追加MIDDLEWAREして変数settings.py

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

    $ python manage.py collectstatic

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

これらの手順を実行すると、サーバーを実行できるようになり、プロダクションモードで静的ファイルを表示できるようになります。

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


私はそれに応じてそれを行い、開発時にはそれはうまくいきましたが、本番環境ではありませんでした。DEBUG == Falseの場合も同じ問題があります
Anna Huang

@AnnaHuang開発と生産でどういう意味ですか?別の環境またはマシンがありますか?それらは同じように構成されていますか?
DarkCygnus

13

実際に、Djangoの本番環境のアプリで静的ファイルを安全に提供できDEBUG=Trueます。

Django自体を使用するのではなく、WSGIファイル(github)でdj_staticを使用します。

# 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())

2
私はその後、ホワイトノイズを発見しました。
ロビンウィンスロー

7

プロジェクトurls.pyを開き、ifステートメントを見つけます。

if settings.DEBUG:
    urlpatterns += patterns(
        'django.views.static',
        (r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )

Trueでsettings.DEBUGを変更することができ、それは常に動作します。しかし、プロジェクトが深刻なものである場合は、上記の他のソリューションについて考える必要があります。

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

3
あなたのコードは正しいですが、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})、]
RoberthSolísAug

6

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

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


0

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

最も安全ではありませんが、ソースコードを変更できます。案内する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静的ファイルを実行してみてください。

:情報はテストのみに使用してください


0

私は私のproject / urls.pyに次の変更を加えました、そしてそれは私のために働きました

この行を追加します:django.conf.urlsからインポートURL

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.