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

时间:2014-07-08 14:23:53

标签: python flask python-requests flask-restful

我尝试为我的资源实现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适用于字典。

1 个答案:

答案 0 :(得分:2)

当您将字典作为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中使用request.get_json()再次加载有效负载:

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

如果您使用的是requests版本2.4.2或更高版本,您也可以将JSON编码保留到requests库;只需将data对象作为json关键字参数传入;也将设置正确的Content-Type标头:

requests.put(url, json=data)

请注意,您无需亲自致电json.dumps()