2

所以我一直在关注本教程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,但是当我使用 post 时,我看不到任何弹出窗口,就像我使用 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

4 回答 4

4

您可能会遇到 Django 的自动 CSRF 保护(对于第一次使用 Django 处理 AJAX 请求的人来说这是一个常见问题)。您可能想查看有关该主题的文档,或者您可以使用装饰器标记您的视图方法@csrf_exempt(尽管如果该方法具有副作用或可能包含安全数据,则会引入安全问题)。

于 2012-08-02T21:27:29.757 回答
4

哦!哇。这是一个很小的错误,我花了一段时间盯着你的代码才发现它。您正在请求/launch_instances(注意末尾没有斜杠)。当 Django 遇到这种情况时,它会自动将请求重定向到/launch_instances/(带有斜杠),但通过重定向,POST 数据被丢弃。添加尾部斜杠,你应该是金色的。

于 2012-08-02T21:51:11.417 回答
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()
        },
    })

这应该有效。

于 2013-04-05T05:56:47.873 回答
0

如果您的 CSRF 启用,那么简单的 ajax 发布将不起作用。您必须添加 csrf 令牌并将其设置为 ajax 请求标头。

对于 Ajax POST 请求,您必须将 CSRF 令牌作为 POST 数据与每个 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();
于 2013-05-21T04:56:44.917 回答