Проблемы с токеном csfr и ajax call - PullRequest
0 голосов
/ 04 февраля 2020

Я попытался реализовать кнопку на веб-сайте, которая при нажатии на нее автоматически запускает на сервере функцию python и копирует некоторое значение в буфер обмена пользователя. Копирование в буфер обмена выполняется нормально, но я не могу запустить функцию python. Всякий раз, когда я пытаюсь это сделать, я получаю ошибку 403 и думаю, что это связано с проблемой с токеном csfr. Может кто-нибудь помочь мне решить эту проблему?

Вот мой HTML

{% if categories %}
<div class="card shadow mb-4">

    <div class="card-body card-interface">

        <table id="predictionTable" class="table table-bordered">
            <thead>
                <tr>
                    <th>Vorhersage</th>
                    <th>Wahrscheinlichkeit</th>
                    <th>Kopieren</th>
                </tr>
            </thead>
            <tbody>
            {% for category in categories %}
            <tr>
                <td>{{ category.0}}</td>
                <td>{{ category.1}}%</td>
                <td><img src="{% static "documents/img/copy.png" %}" class="interface-copy" value="{{ category.0 }}" input_text = "{{ input_text }}" style="cursor: pointer"></td>
            </tr>
            {% endfor %}
            </tbody>
        </table>

    </div>
</div>
<div id="django-data" data-CSRF="{{csrf_token}}"></div>

А вот. js, который запускается

  $(".interface-copy").on('click', function(e) {

    var csrftoken = $("django-data").data().CSRF;
    console.log(csrftoken);
    console.log("test")
    var $temp = $("<input>");
    $("body").append($temp);
    $temp.val($(this).attr('value')).select();
    document.execCommand("copy");
    $temp.remove();
    console.log("test")
    $.ajax({
      url: "/ajax/postSingleSourceEntry/",
      type : 'POST',
      beforeSend: function(request){
        request.setRequestHeader("X-CSRFToken", csrftoken);
      },
      data: {
        csfrmiddlewaretoken: csrftoken
      },
      dataType: "json",
      success: function (data){
        console.log("call created")
      },
      error : function(response){
        console.log(response)
      }
    })
  });

Лучший С уважением!

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Вы можете добавить @csrf_exempt декоратор для этой ajax функции

0 голосов
/ 04 февраля 2020

Изменение:

<div id="django-data" data-CSRF="{{csrf_token}}"></div>

Кому:

<div id="django-data" data-csrf="{{csrf_token}}"></div>

И:

var csrftoken = $("django-data").data().CSRF;

Кому:

var csrftoken = $("#django-data").data().csrf;    // Note the # before django-data and csrf in small letter.

Возможно, вы захотите читать: Как получить атрибут data-id?

...