python - TypeError: EnvironHeaders([•••]) 不是 JSON 可序列化的
问题描述
我想将传入的 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:解包的值太多
解决方案
这是一个肯定有效的最小示例
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()})
(从werkzeug 中的测试用例复制的示例。)
你request.headers.items()
在调试器中检查过吗?
像这样,
items = request.headers.items()
import ipdb
ipdb.set_trace() # check type of items; is it an iterable of pairs?
推荐阅读
- reactjs - Puppeteer - 点击有时不执行
- php - 从多维数组中过滤数组,该数组的值在 php 中大于或等于 x
- angular - 如何从 Angular 5 中的 wp-api 获取标头信息
- events - Vue,如何从父级中的两个子组件监听相同的事件?
- r - 如何在R闪亮的散点图上正确显示x变量
- objective-c - 让xib被解雇
- set - 元素成员在 Perl 6 中是如何工作的?
- javascript - React无限滚动不断发出请求
- git - 我可以在第一次提交之前创建分支,同时保持主分支完整吗?
- c# - 如何让用户在 botframework 中发送图像附件