Django request.is_ajax返回false

时间:2011-12-21 09:36:39

标签: ajax django

我正在使用Django + jQuery测试ajax。我的观点中有这个:

def ajax_test(request):
    if request.is_ajax():
        message = "This is ajax"
    else:
        message = "Not ajax"
    return HttpResponse(message)

这在我的模板中:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script type="text/javascript" src="{{ STATIC_URL }}js/jquery-1.6.4.js"></script>
</head>
<body>
<script>
$.get("/ajax_test", function(data) {
    alert(data);
    });
});
</script>
</body>
</html>

我的问题是 - 为什么这会将“Not ajax”返回到我的html页面?

6 个答案:

答案 0 :(得分:17)

我不知道你发生了什么事。我测试并收到了一条好消息:This is ajax。我的代码:

<强> urls.py

url(r'^$', 'myapp.views.home', name='home'),
url(r'^ajax_test/$', 'myapp.views.ajax_test', name='ajax_test'),

<强> views.py

def home(request):
    return render_to_response('home.html', {},
                          context_instance=RequestContext(request))

def ajax_test(request):
    if request.is_ajax():
        message = "This is ajax"
    else:
        message = "Not ajax"
    return HttpResponse(message)

<强>模板/ home.html做为

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
</head>
<body>
<script type="text/javascript">
    $(document).ready(function () {
        $.get("/ajax_test/", function (data) {
            alert(data);
        });
    });
</script>
</body>
</html>

答案 1 :(得分:11)

看起来is_ajax只检查HTTP_X_REQUESTED_WITH(在HTTP中看起来像X-Requested-With)标头。如果它等于XMLHttpRequest,我们有一个ajax查询。

现在很容易追踪这个标题的命运:

  1. 查看初始HTTP请求(使用浏览器的调试插件,Wireshark,tcpdump或您喜欢的任何其他工具)并查看它是否具有正确的HTTP_X_REQUESTED_WITH标头。如果它没有,问题出在jQuery(或你的脚本)上。

  2. 在重定向过程中,标题可能会丢失,正如丹尼尔罗斯曼所说(我自己也没有看过,但几乎可以肯定它是可能的)。在这种情况下,您将看到两个(或更多)链式HTTP请求,其中一个将缺少HTTP_X_REQUESTED_WITH标头。在这种情况下,问题可能在于web服务器的配置或重定向本身(如果代码生成重定向响应,则可能必须将其删除或手动中继标头)。

  3. 此外,HTTP代理可以剪切标头。在这种情况下,您可以通过流量检查器或request.environ查看服务器端的HTTP请求(环境变量非常混乱,但HTTP标头也在那里)。

答案 2 :(得分:5)

可能你已经打开了APPEND_SLASH(默认设置),Django正在从/ajax_test重定向到/ajax_test/,但没有保留相关的标头。最好首先请求带有斜杠的版本。

答案 3 :(得分:1)

将我的代码调整为以下内容:

views.py:

def index(request):
    return render_to_response('index.html',
                            locals(), context_instance=RequestContext(request)) 

def ajax_test(request):
    if request.is_ajax():
        message = "This is ajax"
    else:
        message = "Not ajax"
    return HttpResponse(message)

urls.py:

urlpatterns = patterns('',   
    #    root
    url(r'^$', views.index, name='index'), 
    #    ajax
    url(r'^ajax_test/$', views.ajax_test, name='ajax_test'),
) 

模板:

 ...
 <script type="text/javascript">
 $(document).ready( function() {
     $.get("/ajax_test/", function(data) {
        alert(data);
     });
 });
 </script>

答案 4 :(得分:-1)

尝试使用其他版本的jQuery ...问题可能出在js ......

例如:

http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js

答案 5 :(得分:-1)

.get来电中,您必须指定CSRF令牌。我不知道这是不是问题,但应该有所帮助。

.get(..., function(data) {

    (...)
    data: { csrfmiddlewaretoken: '{{ csrf_token }}',
    (...)
})