Django说,对于JQuery AJAX请求,is_ajax是错误的

jch*_*ung 13 django ajax jquery google-chrome-extension

上下文: chrome浏览器扩展使用JQuery从远程django应用程序请求响应.Django认识到请求是通过AJAX进行的,并以"Hello AJAX!"响应.我的练习基于这个很好的例子.因为此请求是通过chrome扩展进行的,所以请求是跨站点进行的,所以我@CSRF_exempt在Django视图中使用了装饰器.

问题:我的Django视图没有将请求识别为AJAX请求,而是响应Hello AJAX!它而不是响应Hello not AJAX!.

我的Django视图:(
网址/xhr_test使用以下视图)

@csrf_exempt
def check_login_extension(request):
    if request.is_ajax():
        message = "Hello AJAX!"
    else:
        message = "Hello not AJAX"
    return HttpResponse(message)
Run Code Online (Sandbox Code Playgroud)

我的JQuery请求:

function xhrconnect() {
    $.get("http://localhost:8000/xhr_test", function(data) {
      document.getElementById('xhrmsg').innerHTML = (data);
    });
}
Run Code Online (Sandbox Code Playgroud)

nra*_*itz 15

通过jQuery源代码,它看起来$.ajax()(因此$.get(),$.post()等等)会自动设置crossDomain选项,true如果它看到你正在发出跨域请求,你就是(相关代码).在实际的AJAX请求中,jQuery不会设置HTTP_X_REQUESTED_WITHDjango所需的标头(is_ajax()如果crossDomain已设置)(此处相关代码).

我认为解决这个问题的最简单方法是明确设置crossDomainfalse:

function xhrconnect() {
    $.ajax({
        url: "http://localhost:8000/xhr_test", 
        success: function(data) {
            document.getElementById('xhrmsg').innerHTML = (data);
        },
        crossDomain: false
    });
}
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,您可以尝试使用AJAX预过滤功能HTTP_X_REQUESTED_WITH在请求上手动设置标头.

  • 不确定为什么不起作用 - 似乎正确设置选项,虽然我不知道如何检查请求标题:http://jsfiddle.net/nrabinowitz/MYSDd/2/.另一个选择是传入`headers:[{"X-Requested-With":"XMLHttpRequest"}]`作为选项或`$ .ajaxSetup()`. (2认同)