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

问题描述 投票:1回答:1

这个问题在这里已有答案:

我想将传入的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个回答
2
投票

这是一个确实有效的最小例子

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?
© www.soinside.com 2019 - 2024. All rights reserved.