编辑以备将来参考
解决:在 script.js 的 fetch 请求中,我使用了 Headers
而不是 headers
,因此出现了 "Missing csrf token"
而不是 缺少或不正确的。
所以我正在为一个“密码管理器”构建 Django 项目。我已经构建了我的模块,并通过 Django ModelForm 正确地实现了项目插入,包括 csrftoken 等。
现在我需要进行 ajax 请求以更新 Item 的字段,并希望在同一页上进行。因此,当打开 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
然后在 script.js 文件中,在提交时:
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 请求中,我尝试使用 "X-CSRFToken":event.target.querySelector('[name=csrfmiddlewaretoken]').value
来获取当前表单的 csrf 输入值,而不是使用 getCookie()
。这给了我一个不同的 csrftoken,与之前的不同。
此外,如果我检查每个打开的元素,我会发现它们中的每一个都有一个不同的 csrftoken(好吧,不同的请求,因此我可以理解错误 Incorrect Token
,但我不理解缺失错误)。
另外,如果有人知道更简单的方法,请提示一下,我对此了解有限。
Headers
而不是headers
。 - Divroth