Django с Javascript fetch API: POST работает, но все остальные небезопасные методы запрещены

Я работаю над этим проектом CS50W.

При использовании API fetch для отправки POST запросов на сервер все работало нормально. После того как я изменил метод на PUT или любой другой небезопасный метод, все перестало работать.

Javascript

let like_form = document.querySelector('#like-form');
let data = new FormData(like_form);

fetch(`post/${post_id}/like`, {
  method: 'POST',
  body: data,
  credentials: "same-origin"
})

views.py

@login_required
def like_post(request, post_id):

    if request.method == 'POST':
        post = get_post(post_id)
        if post:
            if request.user in post.liked_by.all():
                post.liked_by.remove(request.user)
                status = False
            else:
                post.liked_by.add(request.user)
                status = True
            
            return JsonResponse({
                'message': 'Success.',
                'status': status
            }, status=200)

index.html

<form id='like-form'>
    {% csrf_token %}
</form>

Вывод с помощью POST

{message: 'Success.', status: false}

Вывод с помощью PUT

PUT http://127.0.0.1:8000/post/17/like 403 (Forbidden)
Forbidden (CSRF token missing.): /post/17/like

Единственное, что я изменил, это method в fetch и views.py

Любая помощь будет оценена по достоинству.

Покопавшись в исходном коде , я обнаружил, что для PUT, csrf_token считывается из headers запроса, а не из тела. Поэтому добавление

headers: {
  'x-csrftoken': CSRF_TOKEN_ELEMENT.value
}

решил проблему

Вернуться на верх