cli*_*ait 5 python python-2.x werkzeug flask python-2.7
我想将传入的 HTTP 请求标头转换为字典,然后通过“JSON 技巧”进行克隆。request.headers是一个行为类似于字典的对象,但实际上不是字典。
json.loads(json.dumps(request.headers))\nRun Code Online (Sandbox Code Playgroud)\n\n上述代码行会导致此错误:
\n\n\n\n\nTypeError: EnvironHeaders([\xe2\x80\xa2\xe2\x80\xa2\xe2\x80\xa2]) 不是 JSON 可序列化
\n
如何将werkzeug.datastructures.EnvironHeaders对象转换为字典?
尝试#1:
\n\njson.loads(json.dumps({k: v for k, v in request.headers.iteritems()}))\nRun Code Online (Sandbox Code Playgroud)\n\n尝试#2:
\n\njson.loads(json.dumps({k: request.headers[k] for k in request.headers.keys()}))\nRun Code Online (Sandbox Code Playgroud)\n\n他们都抛出这个异常:
\n\n\n\nValueError:太多值无法解压
\n
这是一个肯定有效的最小示例
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()})
Run Code Online (Sandbox Code Playgroud)
即使您正在使用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()})
Run Code Online (Sandbox Code Playgroud)
(从werkzeug 中的测试用例复制的示例。)
你request.headers.items()在调试器中检查过吗?
就像这样,
items = request.headers.items()
import ipdb
ipdb.set_trace() # check type of items; is it an iterable of pairs?
Run Code Online (Sandbox Code Playgroud)