繁体   English   中英

AJAX中缺少CSRF令牌

[英]csrf token is missing in ajax

我正在尝试构建一个像按钮一样的ajax,但是ajax代码不起作用。

views.py
def like_button(request,postid):
    postresult=get_object_or_404(post,id=postid)
    if postresult.user_like.filter(id=request.user.id).exists():
        postresult.user_like.remove(request.user)
    else:
        postresult.user_like.add(request.user)
    noresdat=postresult.totallikes
    response_data_to_dump={'success': True,'likes':noresdat}
    data = json.dumps(response_data_to_dump)
    return HttpResponse(data, content_type='application/json')

而模板如下:

{% for p in result %}
    <div class="SpriteContainer"> 
      <a class="postlike" href="/like/{{ p.id }}"><img src="{%static "/images/icons/heart.png" %}"/></a>
      <p class="nolike" style="display: inline-block;">{{ p.totallikes }}</p></div>
    {% endfor %}
<script>
    var csrftoken = $("[name=csrfmiddlewaretoken]").val();
    $(".postlike").click(function(e){
      e.preventDefault();
      var $this = $(this);
      var url = $(this).data("action");
      $.post(url, function(response){
      if(response && response.success==true)
      $this.next(".nolike").text(response.likes);
  });
});

CSRF中间件和模板标签提供了易于使用的跨站点请求伪造保护。(Django)。

并且CSRF中间件默认在MIDDLEWARE设置中被激活。 因此,您要么必须提供csrf令牌,要么必须从CSRF中豁免该视图。 视图基于类或函数。 由于您使用的是基于函数的视图,因此可以利用[csrf_exempt]。 1

from django.views.decorators.csrf import csrf_exempt,
    @csrf_exempt
    def like_button(request,postid):

目前,您没有随请求发送令牌值。

您应该在发布请求数据中发送csrf_token,以便django可以检查其值。

尝试这个-

{% for p in result %}
    <div class="SpriteContainer"> 
      <a class="postlike" href="/like/{{ p.id }}"><img src="{%static "/images/icons/heart.png" %}"/></a>
      <p class="nolike" style="display: inline-block;">{{ p.totallikes }}</p></div>
    {% endfor %}
{% csrf_token %} <!-- getting csrf token value in html page -->


<script>
    var csrftoken = $("[name=csrfmiddlewaretoken]").val();
    $(".postlike").click(function(e){
      e.preventDefault();
      var $this = $(this);
      var url = $(this).data("action");
      $.post(url, {csrfmiddlewaretoken: csrftoken}, function(response){ // send csrf in post request data
      if(response && response.success==true)
      $this.next(".nolike").text(response.likes);
  });
});

通常,使用csrf_exempt被认为是一个坏主意,并且应谨慎使用此变通办法,因为它会使您的网站面临潜在的安全风险。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM