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