【问题标题】:Django AJAX post not working with CSRFDjango AJAX 帖子不适用于 CSRF
【发布时间】:2016-02-05 14:31:38
【问题描述】:

我对我的文章模型进行了类似 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 sn-p:

$(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 错误。

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

【问题讨论】:

    标签: ajax django django-csrf


    【解决方案1】:

    如果您使用的是@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'
          });
    

    你可以查看这个here的Django文档

    【讨论】:

    • 我添加了@csrf_exempt 作为最后的手段,因为我无法让 csrf 工作。您能否给出一个正确的 csrf 调用的 ajax sn-p 的完整示例?
    • 它应该在 POST 数据中,在这里查看答案:stackoverflow.com/questions/8614947/…
    • @ShangWang 看看那里的 cmets。我建议在标题中使用它,这就是我的答案。
    • 我应该用什么代替&lt;csrf_token here&gt;?它给出了一个语法错误。
    • @Jand 你应该用实际的令牌替换&lt;csrf_token here&gt;
    猜你喜欢
    • 2018-08-02
    • 1970-01-01
    • 2017-07-06
    • 2014-09-03
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 2015-08-11
    • 2010-11-22
    相关资源
    最近更新 更多