Python Django调试错误页面无法处理AJAX调用

Python Django调试错误页面无法处理AJAX调用,python,django,Python,Django,django的一个重要特性是在500个错误上返回调试页面 然而,在AJAX调用中,我得到了当DEBUG=False时会出现的纯文本错误。执行非AJAX请求时不会出现此问题:在“正常”请求上,如果发生internet服务器错误,则返回nice调试页面 昨天我将django 1.3升级到1.5 My settings.py具有以下功能: DEBUG = True TEMPLATE_DEBUG = True TEMPLATE_CONTEXT_PROCESSORS contain django.core

django的一个重要特性是在500个错误上返回调试页面

然而,在AJAX调用中,我得到了当
DEBUG=False
时会出现的纯文本错误。执行非AJAX请求时不会出现此问题:在“正常”请求上,如果发生internet服务器错误,则返回nice调试页面

昨天我将django 1.3升级到1.5


My settings.py具有以下功能:

DEBUG = True
TEMPLATE_DEBUG = True
TEMPLATE_CONTEXT_PROCESSORS contain django.core.context_processors.debug
我已将
设置.py
重置为“出厂设置”,但问题仍然存在

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

def webservice(request):
     raise KeyError
     return HttpResponse('it didnt work')
这由以下请求调用:

$.post('/webservice/', {'a':1, 'b':2})
必须注意的是,我使用的是jquery,而这个小宝贝so csrf_令牌被添加到请求中:

$(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\u ajax()和设置。缩小\u ajax上的\u 505\u


然后在
settings.py
中添加
MINIFY\u 505\u ON\u AJAX=False
TEMPLATE\u DEBUG
选项仅适用于呈现Django模板时发生的错误。由于函数不呈现任何模板,因此该选项将无效

发件人:

打开/关闭模板调试模式的布尔值。如果这是真的,那么 错误页面将显示任何异常的详细报告 在模板呈现期间引发。本报告包含相关的 模板的片段,并高亮显示相应的行

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

请注意,在以下示例中:

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})
异常
呈现到\u响应
之前引发,因此
模板调试
将永远没有机会运行

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

良好的调试页面取决于调试设置(从)

模板调试添加与模板呈现错误相关的额外信息

更新

如果request.is_ajax()为true,则响应体中会返回文本回溯,请检查源代码:

此行为在1.4“提交”中更改:

更新2


这有点骇人,但出于调试的目的,您可以修改HTTP_X_REQUESTED_的头,因此request.is_ajax()为false,然后强制执行html响应。(请参阅)

请包含一个AJAX请求的代码。在Django1.3中,我得到了一个完整的调试页面。自1.3以来,该功能似乎发生了变化。这是该版本的文档所说的:“一个打开/关闭模板调试模式的布尔值。如果这是真的,fancy error页面将显示任何TemplateSyntaxError的详细报告。该报告包含模板的相关片段,并突出显示相应的行。”我使用了提供的示例代码,但仍然得到了奇特的调试页面:有趣。我猜不管模板调试是否为真/假,都会发生这种情况。我已经完成了NameError、ZeroDivisionError、etcMy settings之类的操作。py有如下功能:DEBUG=True。同样,这个问题只发生在AJAX请求上。@rikAtee:这不是问题,这就是它的本意,请通过指向源代码的链接检查我的更新。你真棒!谢谢我做了以下操作:编辑了
technical\u 500\u response
if request.is\u ajax()和settings.MINIFY\u 505\u ON\u ajax:
并在settings中添加了MINIFY\u 505\u ON\u ajax=False这是一个更易于维护的修复程序,如果不可维护,django意味着什么!
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).