小编典典

Django表示在JQuery AJAX请求中is_ajax为假

ajax

上下文: chrome浏览器扩展程序使用JQuery请求来自远程django应用程序的响应。Django识别出该请求是通过AJAX发出的,并以“HelloAJAX!”响应。我以这个伟大的榜样为基础进行锻炼。由于此请求是通过chrome扩展程序发出的,因此该请求是跨站点发出的,因此我@CSRF_exempt在Django视图上使用了装饰器。

问题: 我的Django视图无法将请求识别为AJAX请求,并且没有响应Hello AJAX!而是响应Hello not AJAX!

我的Django视图:
(URL /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);
    });
}

阅读 269

收藏
2020-07-26

共1个答案

小编典典

遍历jQuery源,它看起来像$.ajax()(因此$.get(),,$.post()等等)将自动将crossDomain选项设置为,true如果它看到您正在发出跨域请求(此处相关代码)。并且在实际的AJAX请求中,jQuery不会设置HTTP_X_REQUESTED_WITHDjango是否需要设置is_ajax()if
的标头crossDomain此处相关代码)。

我认为解决此问题的最简单方法是显式设置crossDomainfalse

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

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

2020-07-26