gpt4 book ai didi

Python 请求 - 重新验证后重试请求

转载 作者:太空狗 更新时间:2023-10-29 21:58:11 26 4
gpt4 key购买 nike

我正在使用 Python 3.5.1 和 Requests 2.9.1。我的用例如下:我需要从服务 T 进行身份验证(获取 token ),并在向资源服务器 R 发出请求时将其用作 Authorization header 的值。 token 在某个时候过期并且需要取一个新的。

我有一个使用 requests 的应用程序,它在启动时首先获取一个 token 并记住它 - 在用于向 R 请求的 Session 中设置。从那时起 3分钟,一切都很有魅力。 3 分钟后,我收到 unauthorized 响应,因为 token 无效。

我对所有请求使用Session除了用于身份验证的请求;此调用会更新 Session 上的 Authorization header 以供其他请求使用。

我创建了代码以在检测到 unauthorized 时自动重新验证,使用 response Hook (仅在 Session 上设置),在这里是代码:

def __hook(self, res, *args, **kwargs):
if res.status_code == requests.codes.unauthorized:
print('Token expired, refreshing')
self.auth() # sets the token on self.__session

req = res.request
print('Resending request', req.method, req.url, req.headers)
req.headers['Authorization'] = self.__session.headers['Authorization'] # why is it needed?

return self.__session.send(res.request)

基本上,它甚至可以工作。但是,有几个问题:

  1. 为什么需要重新设置请求的 Authorization header ,即使 session 已更新并用于重新发送原始请求?如果没有该行,应用程序将继续刷新 token ,因为从未使用过新 token ,这可以在输出中看到, token 是导致自动刷新的原始 token 。

  2. 如何使代码更健壮,即防止无休止的递归(我不确定这在现实中是否可行,但是在重试请求上设置 Authorization header 的行它只会继续下去)?我正在考虑设置一个自定义 header ,如果 Hook 发现失败的请求有它,它就不会重新验证和重新发送。有更好的吗?编辑:事实证明,如果配置错误,可能会出现(几乎)无限循环(毕竟它是递归的): token 被用于一个环境(如 STAGING),但是资源服务器来自另一个 (TEST) - auth 请求将成功,但 token 对于资源服务器来说实际上是不正确的。目前我实现了上面提到的“特殊” header 解决方案。

一般而言,这是一个好的方法还是有什么更适合requests 中的任务?

最佳答案

这是相同的解决方案,但没有使用类

session = requests.Session()
session.headers.update({"Authorization": f"Bearer deliberate-wrong-token"})

def refresh_token(r, *args, **kwargs):
if r.status_code == 401:
logger.info("Fetching new token as the previous token expired")
token = get_token()
session.headers.update({"Authorization": f"Bearer {token}"})
r.request.headers["Authorization"] = session.headers["Authorization"]
return session.send(r.request, verify=False)

session.hooks['response'].append(refresh_token)

关于Python 请求 - 重新验证后重试请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37094419/

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