在requests.Session中计算请求和更新请求标头

时间:2017-10-22 19:22:41

标签: python python-requests

我正在为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,但不确定如何使用它们 - 查看源代码,似乎钩子只能应用于响应对象,而不是请求对象?

1 个答案:

答案 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的子类化对我来说听起来不错。