Javascript 为什么每次我试图从POST请求获取数据时都会出现多值DictKeyError?
我目前正在学习Django,在这个获取请求中,我总是会遇到相同的错误。我怎样才能避免呢 toup.htmlJavascript 为什么每次我试图从POST请求获取数据时都会出现多值DictKeyError?,javascript,python,django,http,Javascript,Python,Django,Http,我目前正在学习Django,在这个获取请求中,我总是会遇到相同的错误。我怎样才能避免呢 toup.html let data = new FormData(); data.append('amount', document.getElementById('amount').value); data.append('csrfmiddlewaretoken', "{{ csrf_token }}");
let data = new FormData();
data.append('amount', document.getElementById('amount').value);
data.append('csrfmiddlewaretoken', "{{ csrf_token }}");
var response = fetch('{% url "secret" %}', {
method: 'POST',
body: data,
credentials: 'same-origin',
})
views.py
def secret(request):
amount = request.POST["amount"]
错误:
在/secret处出现多值错误
“金额”
请求方法:获取
请求URL:
Django版本:3.0.6
异常类型:多值DictKeyError
异常值:“金额” 异常位置:C:\Users\eric3\AppData\Local\Programs\Python\Python38-32\lib\site packages\django\utils\datastructures.py,位于getitem第78行 Python可执行文件:C:\Users\eric3\AppData\Local\Programs\Python\Python38-32\Python.exe Python版本:3.8.2 我真的很感谢你的帮助
谢谢 打开该URL时会出现
多值DictKeyError
异常,因为当计算请求.POST[“amount”]
时,在POST字典中找不到名为'amount'
的项
显然,您希望secret
view是一个只能通过ajax调用访问的视图,而不是用户访问的视图。如果您不希望出现这种情况,要消除在非ajax请求到达视图时引发的异常,请执行以下操作:
def secret(request):
amount = request.POST.get("amount")
# ... all your other code
现在,不管您的视图是由用户访问还是由ajax调用访问,这个异常都消失了
另一方面,当通过ajax执行POST-method请求时,建议使用cookie中包含的规范csrf令牌。确保已将'X-CSRFToken'
放在HTTP请求头中以执行此操作
JavaScript代码应大致如下所示:
/* Create FormData instance and append the field that you want */
let data = new FormData();
data.append('amount', document.getElementById('amount').value);
/* Perform the fetch call */
fetch("{% url 'secret' %}", {
method: 'POST',
body: data,
headers: {'X-CSRFToken': csrftoken}
})
/* Do whatever you do when a response (successful or not) has been received */
.then(response => {
console.log(response);
})
/* Get csrf cookie */
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = cookies[i].trim();
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
/*创建FormData实例并附加所需的字段*/
let data=new FormData();
data.append('amount',document.getElementById('amount').value);
/*执行fetch调用*/
获取(“{%url”机密“%”){
方法:“POST”,
正文:数据,
标题:{'X-CSRFToken':CSRFToken}
})
/*收到回复(成功与否)后,请执行任何操作*/
。然后(响应=>{
控制台日志(响应);
})
/*获取csrf cookie*/
函数getCookie(名称){
var-cookieValue=null;
if(document.cookie&&document.cookie!=''){
var cookies=document.cookie.split(“;”);
对于(变量i=0;i
如中所述,通过使用嘿,非常感谢您的回答,您可以简化获取cookie的过程。不幸的是,当我在服务器端request.POST.get(“amount”)上使用时,我得到的对象是None。我不知道为什么:(甚至用常量直接替换“getelementbyid”的部分,例如django中的“5”,即“amount”始终具有“无”的值。您如何访问该
机密
视图?如果要访问此URL:http://127.0.0.1:8000/secret
在浏览器中,您将获得分配给amount
变量的None
,因为这是request.POST.get(key)的默认行为
在字典中找不到具有给定键(在本例中,键为“amount”)的任何项(在本例中,字典为POST)时,函数。您实际上希望如何访问此视图?由用户转到URL,还是由AJAX调用请求?基本上,该视图是通过脚本toup.html
的AJAX调用访问的。在该页面中,用户在输入字段中引入(使用id=“amount”
一个金额,然后通过fetch将该请求发送到secret
视图,该视图似乎找不到密钥“amount”。您认为这是为什么?console.log(response)打印了什么?您在secret
视图中返回了什么?