токен csrf отсутствует в ajax - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь создать кнопку с поддержкой 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);
  });
});

Ответы [ 2 ]

0 голосов
/ 06 января 2019

В данный момент вы не отправляете значение вашего токена с вашим запросом.

Вы должны посылать 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 обычно считается плохой идеей, и этот обходной путь следует использовать осторожно, поскольку он подвергает ваш сайт потенциальным угрозам безопасности.

0 голосов
/ 06 января 2019

Промежуточное программное обеспечение CSRF и тег шаблона обеспечивают простую в использовании защиту от подделок межсайтовых запросов. (Django).

И промежуточное программное обеспечение CSRF активируется по умолчанию в настройке MIDDLEWARE. Так что либо вам придется предоставить токен csrf, либо вы должны освободить это представление от CSRF. Представления основаны на классах или функциях. Поскольку вы используете представления на основе функций, вы можете воспользоваться [csrf_exempt]. 1

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