Python Django调试错误页面无法处理AJAX调用
django的一个重要特性是在500个错误上返回调试页面 然而,在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
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).