25

私は実行Django 1.0中で、アプリのデプロイに近づいています。そのため、DEBUG 設定を False に変更します。

そうは言っても、エラーが発生したときに 500.html ページにスタック トレースを含めたいと思います。そうすることで、ユーザーはエラーをコピーして貼り付け、簡単に開発者に電子メールで送信できます。

この問題にどのようにアプローチするのが最善かについて何か考えはありますか?

4

5 に答える 5

18

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")
于 2008-09-23T14:44:50.810 に答える
11

@zacherates が言うように、スタックトレースをユーザーに表示したくありません。この問題への最も簡単なアプローチは、自分自身と開発者が ADMINS 設定で電子メール アドレスをリストされている場合に Django がデフォルトで行うことです。DEBUG = False の 500 エラーが発生するたびに、完全なスタック トレース (およびその他) を含むリスト内の全員に電子メールを送信します。

于 2008-09-23T17:32:19.267 に答える
3

生成された例外をテンプレート (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

于 2013-07-05T07:50:53.047 に答える
1

sys.exc_info()カスタム例外ハンドラを呼び出すことができます。しかし、私はそれをお勧めしません。Django は、例外についてメールを送信できます。

于 2008-09-23T14:46:22.880 に答える