必须返回值时如何保留堆栈跟踪?

时间:2014-12-04 10:14:33

标签: python django

对于网络应用,我有一个方法get_stuff_for_payment,可以将PermissionDenied提升为Django为用户生成HTTP 403

我现在被要求显示友好的错误页面而不是通用403.以下代码执行此操作。但是当我这样做时如何保留堆栈跟踪呢?

    try:
        stuff = get_stuff_for_payment(id)
    except PermissionDenied:
        return render(request, 'friendly_error_page.html', context)

2 个答案:

答案 0 :(得分:1)

如果您只想记录它,那么就这样做。 logging.exception方法将记录消息并自动附加回溯:

except PermissionDenied as err:
    logger.exception('Permission was denied: %s', err)

答案 1 :(得分:0)

我们在python中自定义模板的错误StackTrace

except PermissionDenied:
        return render(request, 'friendly_error_page.html', context)

不是django gor处理403,4xx或5xx错误的好方法。

如果我们想在你的模板(403.html)上显示生成的异常,那么我们可以编写自己的403视图,抓取异常并将其传递给403模板。

步骤:

#。在views.py中:

 import sys,traceback

    def custom_403(request):
    t = loader.get_template('403.html')
    logger.info("custom msg",sys.exc_info()) // for traceback
    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))))

#。在Main Urls.py中:

 from django.conf.urls.defaults import *
    handler403 = 'Project.web.services.views.custom_403'

如果您想向用户显示stacktrace,请使用此模板,否则使用自定义模板

#。在模板(403.html)中:

{{ exception_value }}{{value}}{{tb}}