【问题标题】:Only first key is available after "put"“放置”后只有第一个键可用
【发布时间】:2014-12-07 10:37:18
【问题描述】:

我尝试为我的资源实现 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 可以与字典一起使用。

【问题讨论】:

    标签: python flask python-requests flask-restful


    【解决方案1】:

    当您将字典作为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()

    【讨论】:

    • 谢谢,完美的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多