小编Sor*_*shA的帖子

在后续重试之间更改请求标头

考虑使用 OAuth 令牌的 http 请求。访问令牌需要作为不记名包含在标头中。但是,如果令牌已过期,则需要再次请求刷新令牌,然后重试。所以自定义重试对象将如下所示:

s = requests.Session()
### token is added to the header here
s.headers.update(token_header)
retry = OAuthRetry(
        total=2,
        read=2,
        connect=2,
        backoff_factor=1,
        status_forcelist=[401],
        method_whitelist=frozenset(['GET', 'POST']),
        session=s
    )
adapter = HTTPAdapter(max_retries=retry)
s.mount('http://', adapter)
s.mount('https://', adapter)
r = s.post(url, data=data)
Run Code Online (Sandbox Code Playgroud)

重试类:

class OAuthRetry(Retry):
    def increment(self, method, url, *args, **kwargs):
        # refresh the token here. This could be by getting a reference to the session or any other way.
        return super(OAuthRetry, self).increment(method, url, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

问题是刷新token后,HTTPConnectionPool在调用increment后仍然使用相同的header来发起请求。请参阅:https : //github.com/urllib3/urllib3/blob/master/src/urllib3/connectionpool.py#L787。尽管池的实例以增量方式传递,但更改那里的标头不会影响调用,因为它使用标头的本地副本。

这似乎是一个用例,应该经常出现请求参数在重试之间更改。 …

python urllib3 python-requests

12
推荐指数
1
解决办法
442
查看次数

标签 统计

python ×1

python-requests ×1

urllib3 ×1