Django CSRF Token отсутствует в ajax-запросе
Итак, я создаю проект на Django для "менеджера паролей" Я собрал свои модули и правильно реализовал вставку элемента через Django ModelForm, с csrftoken и все такое.
Теперь мне нужно сделать ajax запрос для обновления полей элемента, и я хочу сделать это на той же странице. поэтому из Js при открытии LoginItem для редактирования содержимого я посылаю GET запрос в таком виде
//fetch django for a form, and it sends back pre filled with initial values
fetch(`edit/login=id`)
.then((response) => response.text())
.then((form) => {
const edit_form = document.createElement('form');
edit_form.setAttribute("method", "post");
edit_form.setAttribute("id", "edittest");
edit_form.innerHTML = form;
//append the form
then in script.js, on submit:
fetch(`edit/login=id}`, {
method : "PUT",
Headers:{
//or "X-CSRFToken":event.target.querySelector('[name=csrfmiddlewaretoken]').value
"X-CSRFToken": getCookie("csrftoken"),
"Content-type": "application/json",
},
mode:"same-origin",
body : JSON.stringify(body),
})
.then((response) => response.json())
.then((data) => {
console.log(data)
})
в Views.py
def edit_login(request, id):
if request.method == GET:
login = Entry.objects.get(id=id)
// setting initial values for the form
initial = {
"title": login.title,
"username": login.username,
"password": login.password,
"note": login.note,
"folder": login.folder,
"protected":login.protected,
"favorite": login.favorite,
}
// setting the initial values to the ModelForm
form = LoginForm(initial=edit)
return render(request, 'vault/new_item.html', {"entry_form": form, 'uri_field': uri})
else if request.method == "PUT":
if request.user == login.owner:
data = json.loads(request.body)
print("test") # execution does not reach here
return JsonResponse({"message": "Succesfully edited"}, status = 200 ) # oppure 204 = No content
Я получаю Forbidden (CSRF token missing.): /edit/login=27
В запросе на выборку PUT я также попробовал вместо getCookie()
использование "X-CSRFToken":event.target.querySelector('[name=csrfmiddlewaretoken]').value
для получения входного значения csrf формы this, которое дало мне csrftoken, отличный от предыдущего.
Кроме того, если я проверю каждый элемент, который я открываю, я вижу, что каждый из них имеет разные csrftoken (ок, разные запросы, поэтому я могу понять ошибку Incorrect Token
, но ошибку отсутствия я не понимаю.
Также, если у кого-то есть подсказка, как сделать это более простым способом, было бы здорово, у меня ограниченные знания
Самый простой способ, которым я решил эту проблему, это включение значения {{csrf_token}}
в данные без использования @csrf_exempt
декоратора в Django ( Декоратор помечает представление как освобожденное от защиты, обеспечиваемой промежуточным ПО.):
var csrftoken = "{{csrf_token}}";
//Sample ajax request
$.ajax({
url: url,
type: 'POST',
headers:{
"X-CSRFToken": csrftoken
},
data: data,
cache: true,
});