Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么每次我试图从POST请求获取数据时都会出现多值DictKeyError?_Javascript_Python_Django_Http - Fatal编程技术网

Javascript 为什么每次我试图从POST请求获取数据时都会出现多值DictKeyError?

Javascript 为什么每次我试图从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 }}");

我目前正在学习Django,在这个获取请求中,我总是会遇到相同的错误。我怎样才能避免呢

toup.html


            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
视图中返回了什么?