Python3.10:如何合并request.headers.raw与字典并适配build_request参数?
解决headers合并的类型不匹配问题
问题原因
dict(request.headers.raw)生成的是Dict[bytes, bytes]类型字典,而{"foo": "bar"}是Dict[str, str]类型,二者合并后得到混合键值类型的字典,不符合client.build_request要求的统一类型(仅接受全str/全bytes的字典、指定格式的序列元组、Headers对象或None)。
可行解决方案
方案1:将新增header转为bytes类型,保持与原headers一致
直接把新增的键值对都转成bytes,合并后得到Dict[bytes, bytes],符合类型要求:
client.build_request(headers=dict(request.headers.raw) | {b"foo": b"bar"})
方案2:将原headers转为str类型字典后合并
先把request.headers.raw的bytes键值解码为str,再和str类型的新增字典合并:
# 将raw headers解码为str类型字典 str_headers = {k.decode('utf-8'): v.decode('utf-8') for k, v in request.headers.raw} # 合并后传入 client.build_request(headers=str_headers | {"foo": "bar"})
注:HTTP headers通常使用UTF-8编码,若有特殊编码可调整解码参数。
方案3:构造符合要求的序列类型
直接生成Sequence[Tuple[bytes, bytes]]或Sequence[Tuple[str, str]]类型的列表,无需转字典:
- 保持bytes类型:
new_headers = list(request.headers.raw) + [(b"foo", b"bar")] client.build_request(headers=new_headers)
- 转为str类型:
new_headers = [(k.decode('utf-8'), v.decode('utf-8')) for k, v in request.headers.raw] + [("foo", "bar")] client.build_request(headers=new_headers)
方案4:使用Headers对象(若依赖库支持)
如果使用的HTTP库提供了Headers类(如requests的requests.structures.Headers),可以直接用对象来合并:
from requests.structures import Headers # 从raw headers初始化Headers对象 headers_obj = Headers(request.headers.raw) # 更新新增header headers_obj.update({"foo": "bar"}) # 传入请求 client.build_request(headers=headers_obj)
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

