@xakslim

Как пройти аутентификацию CSRF?

Всем добра )) Задача в обучающих целях: На странице выводится список услуг, при клике на одну из услуг, ниже появляется подробная информация об услуге. Хочу реализовать это с помощью ajax, только начал изучать и при попытке отправки данных получаю ошибку - 403 csrf.

views.py
import json

from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
from django.views.decorators.http import require_POST


@csrf_exempt
@require_POST
def service_process(request, lang):
    try:
        data = request.POST
    except ValueError:
        data = {}
    return HttpResponse(json.dumps(data), content_type='application/json')


urls.py
from django.conf.urls import re_path

from pages import views


app_name = 'pages'
urlpatterns = (
    re_path(
        r'^(?P<lang>\w{2})/ajax-test/$',
        views.service_process, name='ajax_test'
    ),
)


main.js
function ajaxTest(data, callback) {

  var url = '/' + $('body').attr('data-lang') + '/ajax-test/';

  $.ajax({
    url: url,
    data: data,
    dataType: 'json',
    type: 'POST',
    timeout: 300000,
    success: function (data) {
      console.log(data);
    },
    error: function (jqXHR, textStatus) {
      console.log(textStatus + ' ' + jqXHR.status + ': ' + jqXHR.statusText);
    }
  });
}

$('.service-title').on('click', function () {
  ajaxTest({'service': $(this).text()})
});

page.html (шаблонизатор jinja2)

{%- extends 'layouts/base.html' -%}
{%- block PAGE_TITLE %}{{ current_page.title|e }}{% endblock -%}

{%- block PAGE_CONTENT -%}
<body data-lang="{{ request.LANGUAGE_CODE }}" class="{%- block BODY_CLASSES %}{% endblock %}">
    {%- if services -%}
        <section class="wide-tb-100 pos-rel">
            <div class="container">
                <div class="contact-map-bg option">
                    <ul>
                        {%- for service in services -%}
                        <li class="service-title">{{ service.title }}</li>
                        {%- endfor -%}
                    </ul>
                <div class="service-result">

                </div>
                </div>
            </div>
        </section>
    {%- endif -%}
</body>
{% endblock -%}
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
@Realmixer
Full stack Python (Django) web-developer
Используйте метод GET. Если же необходим именно метод POST, то добавляйте значение csrfmiddlewaretoken равное куке csrftoken. В вашем случае в функции ajaxTest добавить:

data['csrfmiddlewaretoken'] = $.cookie('csrftoken');

Здесь для примера используется древний плагин jquery.cookie. Лучше найти что-то поновее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы