python - 类型错误 : EnvironHeaders([•••]) is not JSON serializable

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

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

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

上述代码行导致此错误:

TypeError: EnvironHeaders([•••]) is not JSON serializable

如何将 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: too many values to unpack

最佳答案

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

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?

关于python - 类型错误 : EnvironHeaders([•••]) is not JSON serializable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52156867/

相关文章:

python - 模块子进程没有属性 'STARTF_USESHOWWINDOW'

python-2.7 - 如何使用 skimage 完全填充图像的孔洞?

python - 非交换符号化(或化简)

python - 如何在 python Flask 中安排定时事件?

python - Flask 在哪里存储上传的文件?

python - 使用自定义采样率将 Mp3 转换为 Wav

Python - 计算 IP 范围内 IP 的最佳方法

python - 获取列表中项目的错误值?设计问题还是逻辑问题?

python - 在python中的while循环中更新 "To:"电子邮件 header

python - 将 StringField 的 FieldList 的条目从 postman 发送到 flask