我正在为RESTful API编写一个python客户端,需要在每个请求上传递一个特殊的头。标头的格式为:X-Seq-Count: n
,其中n
是请求的序号:第一个请求应该有标头X-Seq-Count: 1
,第二个应该有X-Seq-Count: 2
等等。
我使用requests
库来处理低级HTTP调用。跟踪请求数量并注入自定义标头的最佳方法是什么?我想出的是继承requests.Session
并重写Session.prepare_request
方法:
class CustomSession(requests.Session):
def __init__(self):
super().__init__()
self.requests_count = 0
def prepare_request(self, request):
# increment requests counter
self.requests_count += 1
# update the header
self.headers['X-Seq-Count'] = str(self.requests_count)
return super().prepare_request(request)
Hovewer,我对子类化Session
不太满意。有没有更好的办法?我偶然发现文档中的event hooks
,但不确定如何使用它们 - 查看源代码,似乎钩子只能应用于响应对象,而不是请求对象?
答案 0 :(得分:2)
作为替代方案,您可以利用requests
的身份验证机制,您可以修改准备好的Request
对象:
def auth_provider(req):
global requests_count
requests_count += 1
req.headers['X-Seq-Count'] = requests_count
print('requests_count:', requests_count)
return req
requests_count = 0
s = requests.Session()
s.auth = auth_provider
s.get('https://www.example.com')
requests.get('https://www.example.com', auth=auth_provider)
输出:
requests_count: 1
requests_count: 2
但是,Session
的子类化对我来说听起来不错。