在django 1.3中,你现在必须使用csrf,即使是ajax。 我使用jquery,现在我想将csrf标记添加到$ .post。我怎样才能做到这一点?我对jquery不是很熟练,所以用一个好的描述会很好。
这是一个评级应用,点击星标时会发送帖子。 我见过django docs但不明白在我的情况下该怎么做。我的代码如下:
$(function() {
$("#avg").children().not(":input").hide();
$("#rating-widget").children().not("select").hide();
$caption = $("<span/>");
$("#avg").stars({captionEl: $caption});
$("#rating-widget").stars({
inputType: "select",
cancelShow: false,
captionEl: $caption,
callback: function(ui, type, value){
--------------> $.post($("#rating-widget").attr("action"), {score: value}, function(data){
});
}
});
$caption.appendTo("#rating-widget");
});
应该说javascript不在模板中,而是在静态文件中。
将它放在模板中是否最好,以便我可以使用{{ csrf_token }}
提前致谢!
答案 0 :(得分:7)
将此代码放在您的函数之前。它会照顾CSRF。
$('html').ajaxSend(function(event, xhr, settings) {
function getCookie(name) {
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]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
// Only send the token to relative URLs i.e. locally.
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
}
});
答案 1 :(得分:3)
在django documentation中,您可以找到有关如何在每个ajax请求中自动包含csrf令牌的简单说明!
答案 2 :(得分:1)
您不必使用表格!只需创建一个绑定到“星标”帖子的功能的新网址即可。例如
(r'^myapp/star-post/(?P<post_id>.*)/$','myapp.views.myview')
因此,如果您向该网址发送请求,它会在您的数据库中找到该帖子,将该字段更改为“已加星标”并将响应返回给ajax。
然后你可以在成功时使用回调函数来相应地改变CSS(填写星号等)。这样,您就不必担心CSRF。
但您可能会问,那么跨站点脚本攻击呢!好吧,如果你使用cookie验证的用户身份验证,你不必担心! Aaaand你很高兴。