【问题标题】:TypeError: EnvironHeaders([•••]) is not JSON serializableTypeError: EnvironHeaders([•••]) 不是 JSON 可序列化的
【发布时间】:2019-02-08 22:20:30
【问题描述】:

我想将传入的 HTTP 请求的标头转换为字典,然后通过“JSON 技巧”进行克隆。 request.headers 是一个类似于字典的对象,但实际上不是字典。

json.loads(json.dumps(request.headers))

上述代码行导致此错误:

TypeError: EnvironHeaders([•••]) 不是 JSON 可序列化的

如何将werkzeug.datastructures.EnvironHeaders 对象转换为字典?


尝试 #1:

json.loads(json.dumps({k: v for k, v in request.headers.iteritems()}))

尝试 #2:

json.loads(json.dumps({k: request.headers[k] for k in request.headers.keys()}))

他们都抛出这个异常:

ValueError:解包的值太多

【问题讨论】:

    标签: python python-2.7 flask python-2.x werkzeug


    【解决方案1】:

    这是一个肯定有效的最小示例

    headers = werkzeug.datastructures.Headers()
    headers.add('Content-Type', 'text/plain')
    headers.add('X-Foo', 'bar')
    json.dumps({k:v for k, v in headers.iteritems()})
    

    即使你使用EnvironHeaders,

    env = {
        'HTTP_CONTENT_TYPE':        'text/html',
        'CONTENT_TYPE':             'text/html',
        'HTTP_CONTENT_LENGTH':      '0',
        'CONTENT_LENGTH':           '0',
        'HTTP_ACCEPT':              '*',
        'wsgi.version':             (1, 0)
    }
    headers = werkzeug.datastructures.EnvironHeaders(env)
    json.dumps({k:v for k, v in headers.iteritems()})
    

    (从test cases in werkzeug复制的示例。)

    您是否在调试器中检查过request.headers.items()?

    这样,

    items = request.headers.items()
    import ipdb
    ipdb.set_trace()   # check type of items; is it an iterable of pairs?
    

    【讨论】:

    • 我认为这可能更清楚。只需使用{k:v for k, v in request.headers.items()} 作为传递给 json.dumps(thing) 的东西。
    • @MrMesees 你好,我遇到了同样的问题,我在 json.dump 之后得到了字符串,你现在很想从 EnvironHeaders 获取字典吗?我试图将字符串转换为 dict 但该移动中断请求并出现 400 代码“错误请求!”
    • 标头可以包含同一个键​​的多个值,{k:v for k, v in headers.iteritems()} 将只产生每个键中的一个值。最好使用headers.to_wsgi_list() 方法来生成适合json序列化的pairs列表,以免在这里丢失任何数据。
    猜你喜欢
    • 1970-01-01
    • 2017-10-24
    • 2016-08-02
    • 2013-05-11
    • 2014-08-13
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多