3

django 的一个很棒的特性是在 On 500 错误时返回的调试页面。

但是,在 AJAX 调用中,我得到了当DEBUG = False. 执行非 AJAX 请求时不会发生此问题:在“正常”请求中,如果发生 Internet 服务器错误,则返回漂亮的调试页面。

我昨天从 django 1.3 升级到 1.5。

我的 settings.py 有以下内容:

DEBUG = True
TEMPLATE_DEBUG = True
TEMPLATE_CONTEXT_PROCESSORS contain django.core.context_processors.debug

我已将我的重置settings.py为“出厂设置”,但问题仍然存在。

受影响的最简单代码的示例 - 即使是最简单的代码也会受到影响:

def webservice(request):
     raise KeyError
     return HttpResponse('it didnt work')

这是由以下请求调用的:

$.post('/webservice/', {'a':1, 'b':2})

需要注意的是,我使用的是jquery,并且这个小宝贝so csrf_token 是加到requests中的:

$(document).ajaxSend(function(event, xhr, settings) {
        function sameOrigin(url) {
            var host = document.location.host, // host + port
                protocol = document.location.protocol,
                sr_origin = '//' + host,
                origin = protocol + sr_origin;
            return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
                (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
                // or any other URL that isn't scheme relative or absolute i.e relative.
                !(/^(\/\/|http:|https:).*/.test(url));
        }
        function safeMethod(method) {
            return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
        }
        if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
            xhr.setRequestHeader("X-CSRFToken", '{{csrf_token}}');
        }
    });

后代的解决方案

1.4 中的行为更改为仅在请求为 ajax 时返回回溯。下面是如何选择性地恢复该功能(当您主要在 ajax 请求领域工作时,这非常有用):

编辑django.views.debug第 65 行

if request.is_ajax():

if request.is_ajax() and settings.MINIFY_505_ON_AJAX

然后MINIFY_505_ON_AJAX = False加入settings.py

4

2 回答 2

2

“漂亮的调试页面”取决于 DEBUG 设置(来自https://docs.djangoproject.com/en/dev/ref/settings/#debug

One of the main features of debug mode is the display of detailed error pages.
If your app raises an exception when DEBUG is True, Django will display a 
detailed traceback, including a lot of metadata about your environment, such
as all the currently defined Django settings (from settings.py).

TEMPLATE_DEBUG 添加与模板渲染错误相关的额外信息。

更新

如果 request.is_ajax() 为真,那么这就是它应该工作的方式,然后在响应正文中返回文本回溯,检查源:

https://github.com/django/django/blob/master/django/views/debug.py#L59-70

此行为在 1.4 中更改,提交:https ://github.com/django/django/commit/0d9b6a5bc43c06716212bd3f847460ce985381aa

更新 2

这有点骇人听闻,但出于调试目的,您可以修改 HTTP_X_REQUESTED_WITH 标头,使 request.is_ajax() 为 false,然后强制 html 响应。(见https://github.com/django/django/blob/master/django/http/request.py#L136-137

于 2013-04-03T20:31:33.983 回答
1

TEMPLATE_DEBUG选项仅适用于呈现 Django 模板时发生的错误。由于您的函数不呈现任何模板,因此该选项将无效。

来自https://docs.djangoproject.com/en/dev/ref/settings/#template-debug

打开/关闭模板调试模式的布尔值。如果这是真的,花哨的错误页面将显示模板渲染期间引发的任何异常的详细报告。此报告包含模板的相关片段,并突出显示相应的行。

这也意味着即使您的函数确实渲染了模板,如果在渲染模板之前发生错误,您仍然会得到纯文本输出。

请注意,在以下示例中:

def year_archive(request, year):
    a_list = Article.objects.filter(pub_date__year=year)
    raise Exception("something horrible happened")
    return render_to_response('news/year_archive.html', {'year': year, 'article_list': a_list})

Exception以前是被养的render_to_response,所以TEMPLATE_DEBUG永远没有机会跑。

如果您想查看非模板错误的回溯,则需要查看命令行输出或日志。

于 2013-04-03T20:01:39.163 回答