{%csrf_token%}可能不方便?

时间:2016-09-05 09:06:43

标签: django

Django 1.10

在文档中我们可以阅读:

  

虽然上面的方法可以用于AJAX POST请求,但它有一些   不便之处:您必须记住在POST中传递CSRF令牌   每个POST请求的数据。

https://docs.djangoproject.com/es/1.10/ref/csrf/#ajax

上面提到的“上述方法”是关于向表单添加{%csrf_token%}。

在文档中说,更方便的可能是:

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

好吧,我无法发现{%csrf_token%}可能不方便。

我试过了:

<form action="" method="post">{% csrf_token %}



function post_create(){

    $.ajax({
        method: "POST",
        url: '{{ object.get_frame_date_create_url }}',
        data: $("#object_form").serialize(),
        success: add_post_data,
        error: fail,
        });
}

似乎有效。 $(“#object_form”)。serialize()的结果如下所示:

"csrfmiddlewaretoken=NFgXO1gsHJbi0N1IUb5ZPQ2rno2RGBrRR8kxboewWDC63sm2hxlvXtUtyviCSoZ1&date=2015-01-01&precision=F&frame=1"

我在这里必须记住什么?我怎么能忘记传递csrfmiddlewaretoken?它只是形式的一个普通领域。隐藏在用户之外,但不是来自程序员。

是否有必要手动触摸表单中的每个字段并单独发送。我无法想象。

您的评论将受到高度赞赏:我是否理解正确$(“#object_form”)。serialize()没问题?在这种情况下,使用ajaxSetup是更具修道院的吗?

1 个答案:

答案 0 :(得分:0)

您绝对没有理由需要HTML表单来发送POST请求。例如,此页面上的upvote / downvote按钮和收藏夹按钮都是简单的按钮,可以在不触及HTML表单的情况下发送AJAX POST请求。

异步提交表单只是AJAX的众多用例之一。如果这是您使用AJAX的唯一方法,那么来自文档的代码可能不会给您带来太大的好处。但是,如果您将其用于许多其他用例中,它将更加方便。