私は実行Django 1.0
中で、アプリのデプロイに近づいています。そのため、DEBUG 設定を False に変更します。
そうは言っても、エラーが発生したときに 500.html ページにスタック トレースを含めたいと思います。そうすることで、ユーザーはエラーをコピーして貼り付け、簡単に開発者に電子メールで送信できます。
この問題にどのようにアプローチするのが最善かについて何か考えはありますか?
私は実行Django 1.0
中で、アプリのデプロイに近づいています。そのため、DEBUG 設定を False に変更します。
そうは言っても、エラーが発生したときに 500.html ページにスタック トレースを含めたいと思います。そうすることで、ユーザーはエラーをコピーして貼り付け、簡単に開発者に電子メールで送信できます。
この問題にどのようにアプローチするのが最善かについて何か考えはありますか?
500 を自動的に記録するには、次のようにします。
Joel は、アプリケーションで障害が発生したときに、バグ トラッカーでチケットを自動的に作成することさえ推奨しています。個人的には、開発者が購読できるスタック トレースや URL などを含む (プライベート) RSS フィードを作成します。
一方、スタック トレースをユーザーに表示すると、悪意のあるユーザーがサイトを攻撃するために使用できる情報が漏洩する可能性があります。過度に詳細なエラー メッセージは、SQL インジェクション攻撃への古典的な足がかりの 1 つです。
編集(トレースバックをキャプチャするコード サンプルを追加):
sys.exc_info 呼び出しから例外情報を取得できます。表示用にトレースバックをフォーマットする際は、traceback モジュールから取得します。
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 テンプレートに渡します。
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))))
from django.conf.urls.defaults import *
handler500 = 'project.web.services.views.custom_500'
{{ exception_value }}{{value}}{{tb}}
詳細はこちら: https://docs.djangoproject.com/en/dev/topics/http/views/#the-500-server-error-view
sys.exc_info()
カスタム例外ハンドラを呼び出すことができます。しかし、私はそれをお勧めしません。Django は、例外についてメールを送信できます。