“put”后只有第一个键可用

2024-05-21 13:19:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试为我的资源实现put处理程序。代码如下:

class Settings(restful.Resource):
    def put(self):
        settings = request.form['settings']
        print settings

我是这样把数据放在那里的:

import requests
url='http://localhost:8000/settings'
data = {'settings': {
            'record': {
                'b': 'ok',
                'c': 20,
                'd': 60,
            },
            'b': {
                'c': {
                    'd': 3,
                    'e': 2,
                    'f': 2,
                },
                'd': 5,
                'a': 'voice',
                'k': {
                    'l': 11.0,
                    'm': 23.0,
                },
            }
        }
}
requests.put(url, data)

在我的控制台中只有record打印出来,所以当我进行验证时,它失败了,因为数据不是字典。我不知道怎么了。你知道吗

它看起来与Flask RESTful Quickstart中的代码相同,如果我做对了requests可以使用字典。你知道吗


Tags: 数据代码restfulurl处理程序data字典settings
1条回答
网友
1楼 · 发布于 2024-05-21 13:19:58

当您作为data参数传入字典时,requests将数据编码到``application/x-www-form-urlencoded`,就像浏览器表单一样。此编码格式不支持(有序、非唯一)键值序列之外的结构化数据。你知道吗

不要使用application/x-www-form-urlencoded发布结构化数据。改用JSON:

import json

# ...

requests.put(url, json.dumps(data), headers={'Content-Type': 'application/json'})

然后在Flask中使用^{}再次加载有效负载:

class Settings(restful.Resource):
    def put(self):
        settings = request.get_json()['settings']
        print settings

如果您使用的是requestsversion 2.4.2或更新版本,也可以将JSON编码保留在requests库中;只需将data对象作为json关键字参数传入即可;还将设置正确的内容类型头:

requests.put(url, json=data)

请注意,这样您就不必自己调用json.dumps()。你知道吗

相关问题 更多 >