Django AJAX发布不与CSRF合作

时间:2015-11-04 22:07:42

标签: ajax django django-csrf

我对我的文章模型有这样的ajax投票:

@csrf_exempt
@login_required
def like(request):
    args = {}
    if request.method == 'POST':
        user = request.POST.get('user')
        lu= request.user 
        post_id = int(request.POST.get('post_id'))
        try:
            liked_article = Article.objects.get(id = post_id)
        except:
            liked_article = None  

        if ArticleLike.objects.filter(liker=lu.id, article=post_id).exists():

            liked_article.likes -=1
            liked_article.save()
            ArticleLike.objects.filter(article=post_id, liker=lu.id).delete()


        else:            
            liked_article.likes +=1
            liked_article.save()
            newliker = ArticleLike(article=post_id, liker=lu.id)
            newliker.save()          

    args.update(csrf(request))
    args['likes'] = str(liked_article.likes)
    return render(request, 'ajax_like.html', args)   

这是ajax片段:

$(function(){
$('#like').click(function(){
      $.ajax({
               type: "POST",
               url: "/article/like/",
               data: {
               'post_id': $(this).attr('name'), 
               'csrfmiddlewaretoken': '{{csrf_token}}'
               },
               success: likeSuccess,
               dataType: 'html'
                }); 
    });

});
function likeSuccess(data, textStatus, jqXHR)
{
    $('#like_count').html(data);
}

和ajax_lik.html

<p id="like_count">
{% if likes > 0 %}
{{likes}}
</p>
{% else %}
wow
</i>

{%endif%} 该视图非常适合@csrf_exempt装饰器激活,但使用csrf时,我得到403 Forbidden错误。

我尝试了不同的调整,但无法弄清楚如何解决这个问题,所以感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果您使用的是@csrfexempt装饰器,那么您不需要发送csrf_token。顺便说一句,csrf_token不应该成为POST数据的一部分,

data: {
       'post_id': $(this).attr('name'), 
       'csrfmiddlewaretoken': '{{csrf_token}}'
      }

它应该在请求的标头"X-CSRFToken"中。

这里有一个使用jquery(docs here)将自定义标头设置为ajax请求的示例:

$.ajax({
         url: "/article/like/",
         data: { post_id: $(this).attr('name') },
         type: "POST",
         beforeSend: function(xhr){xhr.setRequestHeader('X-CSRFToken', "{{csrf_token}}");},
         success: likeSuccess,
         dataType: 'html'
      });

您可以看到Django的文档here