11

これを使用して、カスタムミドルウェアクラスのprocess_exception()メソッド内にhtmlログファイルを生成したいと思います。例:

  • 例外がキャッチされました。
  • process_exception(request)が呼び出されました。
  • process_exceptionは、デフォルトのエラーhtmlを返す関数を呼び出します。
  • process_exceptionは、返されたhtmlをdjangoサーバーが実行されているログフォルダーに書き込みます。

Djangoがこれらの例外のメールを送信できることは知っていますが、これは使用したくありません。私はJSONを使用してRESTfulアプリケーションに取り組んでいるので、エラー500を示すjson文字列を返し、htmlを別の場所に配置する方が適切だと感じています。

前もって感謝します。

申し訳ありませんが、明確にする必要があります。独自の500.htmlを作成したくないので、Debug=Trueの場合にdjangoが使用するものを使用します。つまり、エラーファイルを生成し、ログフォルダに配置します。

助けてくれたMarkに感謝します-興味のある人のための私の解決策は次のとおりです。

import logging
import os
import settings
import sys
import datetime

from response import get_json_response
from django.views.debug import ExceptionReporter

logging.config.dictConfig(settings.LOGGING)
LOGGER = logging.getLogger('console_logger')

class LoggingMiddleware(object):

    def process_exception(self,request,exception):
        exc_type, exc_value, exc_traceback = sys.exc_info()
        er = ExceptionReporter(request, exc_type, exc_value, exc_traceback)
        time = str(datetime.datetime.now())
        file_path = os.path.join(settings.LOG_FOLDER, "{}.html".format(time))
        LOGGER.error("Writing error 500 traceback to %s" % file_path)
        file_handle = open(file_path,'w')
        file_handle.write(er.get_traceback_html())
        file_handle.close()
        return get_json_response(500,"HTTP Error 500: Internal Server Error")

このコードは、例外をインターセプトし、sysモジュールとdjangosのデフォルトエラーテンプレートを使用して、適切にフォーマットされたトレースバック/例外情報ページを生成し、これをログフォルダーに配置してから、httpエラー500が発生したことを示すJSONオブジェクトを返します。

4

3 に答える 3

6

500トレースバックページは、TECHNICAL_500_TEMPLATEにハードコードされたテンプレート文字列()を使用しdjango.views.debugます。レポートは、独自のログ生成のために再利用できるはずのExceptionReporterクラスも含まれているクラスによって生成されます。django.views.debug

于 2012-10-17T13:01:53.347 に答える
3

テンプレート()で生成された例外を表示したい場合は500.html、独自の500ビューを作成し、例外を取得して500テンプレートに渡すことができます。

手順:

my_app.views.pyで

import sys
import traceback

from django.http.response import HttpResponseServerError
from django.template import loader
from django.template.context import Context, RequestContext


def custom_500(request):
    t = loader.get_template('500.html')
    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 = 'my_app.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:47:40.520 に答える
1

重複: テンプレートが存在しません:500.html

基本的には、テンプレートフォルダに500.htmlを置くだけで、それが使用されます。

于 2012-10-16T23:14:17.487 に答える