gpt4 book ai didi

python - 在后续重试之间更改请求 header

转载 作者:行者123 更新时间:2023-12-03 15:13:46 29 4
gpt4 key购买 nike

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

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)
重试类:
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)
问题是,刷新 token 后,HTTPConnectionPool 在调用增量后仍然使用相同的 header 发出请求。见: https://github.com/urllib3/urllib3/blob/master/src/urllib3/connectionpool.py#L787 .
尽管池的实例是以增量方式传递的,但更改那里的 header 不会影响调用,因为它使用的是 header 的本地副本。
这似乎是一个应该经常出现的用例,以使请求参数在重试之间发生变化。
有没有办法在两次后续重试之间更改请求 header ?

最佳答案

不,在当前版本的 Requests(2.18.4) 和 urllib3(1.22) 中。
重试最终由 openurl 处理在 urllib3.并且通过跟踪整个函数的代码,没有接口(interface)可以更改headers重试之间。
并动态变化headers不应被视为解决方案。来自 doc :

headers – Dictionary of custom headers to send, such as User-Agent, If-None-Match, etc. If None, pool headers are used. If provided, these headers completely replace any pool-specific headers.

headers是传递给函数的参数。而且没有 保证通过后不会被复制。虽然在当前版本的 urllib3 中, openurl不复制 headers , 基于更改 headers 的任何解决方案被认为是 哈克 ,因为它基于实现而不是文档。
一种解决方法
中断一个函数并编辑它正在使用的一些verible是 非常危险 .
一种简单的解决方案是检查响应状态并在需要时重试,而不是向 urllib3 中注入(inject)一些东西。
r = s.post(url, data=data)
if r.status_code == 401:
# refresh the token here.
r = s.post(url, data=data)
为什么原来的方法不起作用?
请求复制 prepare_headers 中的 header 在将其发送到 urllib3 之前。所以 urllib3 重试时使用编辑前创建的副本。

关于python - 在后续重试之间更改请求 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63064707/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com