在django中使用ajax时无法发布

时间:2012-08-02 21:14:53

标签: jquery ajax django post

所以我一直在关注本教程http://webcloud.se/log/AJAX-in-Django-with-jQuery/,并且get方法运行正常。也就是说我弹出一个弹出窗口说它应该在弹出窗口中说什么。但是,当我使用post方法时,我什么也得不到。看来该请求甚至无法达到我的观点。

这就是我处理这个问题的javascript:

$(document).ready(function(){

    $("#popupbutton").click(function(){
        $.post("/launch_instances", { 
                name: "Monty",
                food: "Spam" 
            },
            function(data) {
                alert(data);
            }
        );
     });
 ...................

这是我模板的相关部分:

<center>
   <div id="popupbutton"><input type="submit" value="Launch Instances!" /></div>
</center>

这是我的views.py:

from django.http import HttpResponse

def li_view(request):
    return HttpResponse("post gets to the view")
    if request.is_ajax():
        if request.method == 'GET':
            message = "This is an XHR GET request"
        elif request.method == 'POST':
            message = "This is an XHR POST request"
        else:
            message = "Nothing"
    else:
        message = "No XHR"

    return HttpResponse(message)

正如你所看到的,当我到达我的观点时,我做的第一件事是返回一个HttpResponse,但是当我使用帖子时,我不会看到任何弹出窗口,就像我在使用get时那样。所以我的猜测是,由于某种原因,请求甚至无法到达视图。

这就是我的urls.py:

from django.conf.urls import patterns, include, url
from django.contrib import admin

admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^launch_instances/', 'simdata.views.li_view'),

    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
)

有类似的问题,但没有像这样的古怪。我是django / ajax / jquery的新手,所以可能会遗漏一些非常小的东西。

提前致谢:)

4 个答案:

答案 0 :(得分:4)

您可能会遇到Django的自动CSRF保护(这是第一次使用Django进行AJAX请求的人们的常见问题)。您可能希望查看the documentation on the topic,或者可以使用@csrf_exempt装饰器标记您的查看方法(但如果该方法有副作用或可能包含安全数据,则会引入安全问题)。

答案 1 :(得分:4)

哦!哇。这是一个小错误,我花了一段时间盯着你的代码发现它。您正在请求/launch_instances(注意不带结尾的斜杠)。当Django遇到此问题时,它会自动将请求重定向到/launch_instances/(带斜杠),但通过重定向,POST数据将被删除。添加尾部斜杠,你应该是金色的。

答案 2 :(得分:0)

添加{%csrf_token%}后,Django会创建一个隐藏的项目,如下所示:

 < input type='hidden' name='csrfmiddlewaretoken' value='S1aE7jMFsF24X84CWKf2GxY1UoLzfpf9' / >

因此,当您使用javascript发布表单时,也应该发布隐藏的csrf_token。尝试将此值与jquery ajax调用一起添加,如下所示:

 $.ajax({
        type:'POST',
        url: "/some/url/",
        data: {
            username: $("#username").val(),
            csrfmiddlewaretoken: $('[name="csrfmiddlewaretoken"]').val()
        },
    })

这应该有用。

答案 3 :(得分:0)

如果启用了CSRF,那么简单的ajax帖子就无效了。您将不得不添加csrf标记并将其设置为ajax请求标头。

对于Ajax POST请求,您必须在每次POST请求时将CSRF令牌作为POST数据传递。因此,您必须首先获得CSRF令牌。由于您已启用CSRF保护,因此您将从csrftoken cookie获取令牌。默认情况下,CSRF令牌cookie名为csrftoken。获取令牌非常简单,可以使用下面的代码片段来实现。

enter code here
function getCSRFCookie()
{
name = 'csrftoken';
var cookieValue = null;
    if (document.cookie && document.cookie != '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);

            if (cookie.substring(0, name.length + 1) == (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrf_token = getCSRFCookie();