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
}
решил проблему