Django 500.html ページにスタックトレースを含めるにはどうすればよいですか?
-
02-07-2019 - |
質問
私は走っています Django 1.0
アプリのデプロイも近づいています。そのため、DEBUG 設定を False に変更します。
そうは言っても、エラーが発生したときのスタックトレースを 500.html ページに含めたいと考えています。そうすることで、ユーザーはエラーをコピーアンドペーストして、開発者に簡単に電子メールで送信できます。
この問題に取り組む最善の方法について何か考えはありますか?
解決
この方法で、500 番台を自動的に記録します。
- それがいつ起こるかはわかります。
- ユーザーがスタックトレースを送信してくれることに依存する必要はありません。
Joel 氏は、アプリケーションに障害が発生したときに、バグ トラッカーにチケットを自動的に作成することまで行うことを推奨しています。個人的には、スタックトレースや URL などを含む (プライベート) RSS フィードを作成します。開発者が購読できるもの。
一方、スタック トレースをユーザーに表示すると、悪意のあるユーザーがサイトを攻撃するために使用できる情報が漏洩する可能性があります。過度に詳細なエラー メッセージは、SQL インジェクション攻撃の典型的な踏み台の 1 つです。
編集 (トレースバックをキャプチャするコード サンプルを追加しました):
例外情報は、sys.exc_info 呼び出しから取得できます。表示用にトレースバックをフォーマットする際、トレースバック モジュールから取得されます。
import traceback
import sys
try:
raise Exception("Message")
except:
type, value, tb = sys.exc_info()
print >> sys.stderr, type.__name__, ":", value
print >> sys.stderr, '\n'.join(traceback.format_tb(tb))
プリント:
Exception : Message
File "exception.py", line 5, in <module>
raise Exception("Message")
他のヒント
@zacherates が言うように、実際にはユーザーにスタックトレースを表示したくないのです。この問題に対する最も簡単なアプローチは、ADMINS 設定に自分自身と開発者が電子メール アドレスとともにリストされている場合に、Django がデフォルトで行うことです。DEBUG = False の 500 エラーが発生するたびに、完全なスタック トレース (およびそれ以上) を含む電子メールがリスト内の全員に送信されます。
生成された例外をテンプレート (500.html) に表示したい場合は、独自の 500 ビューを作成し、例外を取得して 500 テンプレートに渡すことができます。
手順:
# views.py 内:
import sys,traceback
def custom_500(request):
t = loader.get_template('500.html')
print sys.exc_info()
type, value, tb = sys.exc_info()
return HttpResponseServerError(t.render(Context({
'exception_value': value,
'value':type,
'tb':traceback.format_exception(type, value, tb)
},RequestContext(request))))
# メインの urls.py 内:
from django.conf.urls.defaults import *
handler500 = 'project.web.services.views.custom_500'
# テンプレート(500.html)内:
{{ exception_value }}{{value}}{{tb}}
詳細については、こちらをご覧ください: https://docs.djangoproject.com/en/dev/topics/http/views/#the-500-server-error-view
電話してもいいよ sys.exc_info()
カスタム例外ハンドラー内。しかし、それはお勧めしません。Django は例外についてメールを送信できます。
これは古い質問であることは承知していますが、最近では次のようなサービスを使用することをお勧めします。 衛兵 エラーをキャプチャします。
Django では、これを設定する手順は非常に簡単です。から ドキュメント:
- 以下を使用して Raven をインストールします
pip install raven
- 追加
'raven.contrib.django.raven_compat'
あなたへsettings.INSTALLED_APPS
. - 追加
RAVEN_CONFIG = {"dsn": YOUR_SENTRY_DSN}
設定に合わせます。
次に、500 ページ (で定義されています) handler500
)、を渡します request.sentry.id
テンプレートに追加すると、ユーザーは内部情報が公開されることなく特定のエラーを参照できるようになります。