我读到这两个基本相同的东西,但是每个人都给我不同的错误我不知道要追哪一个。我甚至不知道如何解决这个问题。有人可以看看我的代码,我现在已经两天苦苦挣扎了。
我的HTML
<div id='notificationsLoader'>
</div>
<script>
$(document).ready(function(){
$(".notification-toggle").click(function(e){
e.preventDefault();
$.ajax({
type:"POST",
url:"{% url 'get_notifications_ajax' %}",
data: {
csrfmiddlewaretoken:"{%csrf_token%}",
},
success: function(data){
$("#notificationsLoader").html('<h3>notifications</h3>');
$(data.notifications).each(function(){
$("notificationsLoader").append(this + "<br/>")
})
console.log(data.notifications);
},
error: function(rs, e){
console.log(rs);
console.log(e);
}
})
})
})
</script>
其他html
<li><a class="notification-toggle" href="#">notification</a></li>
并且通知来自我的python代码
@login_required
def get_notifications_ajax(request):
notification = Notification.objects.get(id=id)
notes =[]
for note in notifications:
notes.append(str(note))
data={
"notifications":notes
}
json_data = json.dumps(data)
return HttpResponse(json_data, content_type='application/json')
还有更多内容,但我会发布这一部分因为我认为错误(403和500)都说我的服务器端错了
答案 0 :(得分:1)
来自Django Project Documenation:
虽然上述方法可用于AJAX POST请求,但它有一些不便之处:您必须记住将CSRF令牌传递给 每个POST请求POST数据。出于这个原因,有一个 替代方法:在每个XMLHttpRequest上,设置一个自定义的X-CSRFToken 标头为CSRF令牌的值。这通常更容易,因为 许多javascript框架提供了允许设置标头的钩子 在每一个请求上。
因此,您可以将csrftoken值作为X-CSRFToken
标头传递,它可以从cookie中获取(我已根据需要添加了getCookie
函数)。您可以在发送之前使用ajaxSetup设置ajax请求轻松完成此操作,请参阅以下代码:
// Source https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/#ajax
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;
}
$(".notification-toggle").click(function(e){
e.preventDefault();
var token = getCookie('csrftoken');
$.ajaxSetup({'headers': {'X-CSRFToken': token}});
// $.ajax...
另外,您可以尝试从以下位置替换数据:
data: {
csrfmiddlewaretoken:"{%csrf_token%}",
},
到
data: {
csrfmiddlewaretoken:$("input[name=csrfmiddlewaretoken]").val()
},