【发布时间】:2020-05-12 16:39:29
【问题描述】:
我有一个 Django 3 应用程序,在引导模式上带有 jQuery Ajax 帖子。 很少有按钮没有任何形式,但使用 post 调用某些 url。
所有 Django 方法都按照此处所述实现:https://docs.djangoproject.com/en/3.0/ref/csrf/ 所有标头都已正确发送。
当用户登录以及用户退出后,页面和功能都可以正常工作。
但是,Ajax 调用返回错误响应为 Forbidden(CSRF cookie 未设置。),当第一次访问该站点时以及在未登录时处于隐身模式时。一旦用户登录,即使在用户登录后问题也得到解决出去。
请指导可能的原因。
编辑:根据 cmets 的要求,PFB 是众多 Ajax 调用之一。
<script>
$('.likelink').on("click", function (event){
event.preventDefault();
var postid = $(this).attr("data-catid");
$.ajax({
type: 'POST',
url: "{% url 'like_post' %}",
data: {"post_id": postid},
success: function (response){
if(response["valid"]){
alert("Yeah!!! You Liked the post :)");
$('#likelinkid'+postid).remove();
}
else{
alert("Kindly login to Like!!!");
}
},
error: function (response){
alert(response["responseJSON"]["error"]);
}
});
});
</script>
同样有多个脚本排列在不同的锚标记上。如问题中所述,当用户登录和用户注销后,上述脚本工作正常。
编辑2:仅供参考,我正在编写按照Django文档使用的csrf相关代码:
<script type="text/javascript">
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 = cookies[i].trim();
// 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;
}
var csrftoken = getCookie('csrftoken');
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);
}
}
});
</script>
除了上述之外,我还尝试过使用视图装饰器@requires_csrf_token 和@ensure_csrf_cookie,但这并没有解决上述问题。
【问题讨论】:
-
你能分享你的 AJAX 调用吗?
-
@iklinac 你明白我已经在我的问题中提到了这个链接并且同样的实现了吗?
-
@WillemVanOnsem 我已经添加了相同的内容。请检查。
-
您没有在问题中提供任何代码,除了将您链接回文档之外,您认为有人可以如何帮助您