{{csrf_token}}给了我403 Forbidden和{%csrf_token%}给了我500服务器错误

时间:2016-02-26 02:03:16

标签: javascript jquery python django

我读到这两个基本相同的东西,但是每个人都给我不同的错误我不知道要追哪一个。我甚至不知道如何解决这个问题。有人可以看看我的代码,我现在已经两天苦苦挣扎了。

我的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)都说我的服务器端错了

1 个答案:

答案 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()
      },