11

我想用它在我的自定义中间件类的 process_exception() 方法中生成 html 日志文件,例如:

  • 捕捉到异常。
  • process_exception(request) 调用。
  • process_exception 调用返回默认错误 html 的任何函数。
  • process_exception 将返回的 html 写入 django 服务器运行的某个位置的日志文件夹。

我知道 Django 能够为这些异常发送电子邮件,但我不想使用它。我正在使用 JSON 开发一个 RESTful 应用程序,因此返回一个说明错误 500 的 json 字符串然后将 html 放在其他地方感觉更合适。

提前致谢。

抱歉,也许我需要澄清一下:我不想创建自己的 500.html,我想使用 django 在 Debug=True 时使用的那个。即生成错误文件并将其放在日志文件夹中。

感谢 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 默认错误模板生成格式良好的回溯/异常信息页面,然后将其放置在日志文件夹中,然后返回一个 JSON 对象,说明存在 http 错误 500。

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 回答