上下文: chrome浏览器扩展程序使用JQuery请求来自远程django应用程序的响应。Django识别出该请求是通过AJAX发出的,并以“HelloAJAX!”响应。我以这个伟大的榜样为基础进行锻炼。由于此请求是通过chrome扩展程序发出的,因此该请求是跨站点发出的,因此我@CSRF_exempt在Django视图上使用了装饰器。
@CSRF_exempt
问题: 我的Django视图无法将请求识别为AJAX请求,并且没有响应Hello AJAX!而是响应Hello not AJAX!。
Hello AJAX!
Hello not AJAX!
我的Django视图: (URL /xhr_test使用以下视图)
/xhr_test
@csrf_exempt def check_login_extension(request): if request.is_ajax(): message = "Hello AJAX!" else: message = "Hello not AJAX" return HttpResponse(message)
我的JQuery请求:
function xhrconnect() { $.get("http://localhost:8000/xhr_test", function(data) { document.getElementById('xhrmsg').innerHTML = (data); }); }
遍历jQuery源,它看起来像$.ajax()(因此$.get(),,$.post()等等)将自动将crossDomain选项设置为,true如果它看到您正在发出跨域请求(此处为相关代码)。并且在实际的AJAX请求中,jQuery不会设置HTTP_X_REQUESTED_WITHDjango是否需要设置is_ajax()if 的标头crossDomain(此处为相关代码)。
$.ajax()
$.get()
$.post()
crossDomain
true
HTTP_X_REQUESTED_WITH
is_ajax()
我认为解决此问题的最简单方法是显式设置crossDomain为false:
false
function xhrconnect() { $.ajax({ url: "http://localhost:8000/xhr_test", success: function(data) { document.getElementById('xhrmsg').innerHTML = (data); }, crossDomain: false }); }
如果这不起作用,则可以尝试使用AJAX预过滤器功能手动HTTP_X_REQUESTED_WITH在请求上设置标头。