为什么不使用request而使用session
关键原因在于你所发送的网络请求是否需要"记忆性",如果需要那么使用requests.session模块。它会自动为开发者维护在平台上的认证和登录信息,能够记录客户端和服务器交互过程中产生的cokie信息。
我们定义一个autoauthsession类对象,它继承自requests.session模块。
为什么需要自定义session对象
因为平台的认证有一个过期时间限制。为了确保session对象在使用api过程不会失效,我们希望其能自行检测,并在cokie失效后自动实现登录。
session.request 实现了什么
通过查看requests 的源代码,我们了解到requests.session 继承自 sessionredirectmixin。这个类有6个实例方法。主要实现重定向对应的功能。
其次,session继承sessionredirectmixin( 实际上遵循mixin设计模式,父类提供工具方法 )。session中定义了request方法,它是一个关键。具体代码如下:
def request(
self,
method,
url,
params=none,
data=none,
headers=none,
cookies=none,
files=none,
auth=none,
timeout=none,
allow_redirects=true,
proxies=none,
hooks=none,
stream=none,
verify=none,
cert=none,
json=none,
):
# create the request.
req = request(
method=method.upper(),
url=url,
headers=headers,
files=files,
data=data or {},
json=json,
params=params or {},
auth=auth,
cookies=cookies,
hooks=hooks,
)
prep = self.prepare_request(req)
proxies = proxies or {}
settings = self.merge_environment_settings(
prep.url, proxies, stream, verify, cert
)
# send the request.
send_kwargs = {
"timeout": timeout,
"allow_redirects": allow_redirects,
}
send_kwargs.update(settings)
resp = self.send(prep, **send_kwargs)
return resp
封装 http 请求的全流程:从接收用户传入的请求参数,到构建、预处理请求,再到发送请求并返回响应,把复杂的 http 协议细节抽象成简单的参数调用。
- 把用户传入的零散参数封装成一个 request 类实例 - 仅存储参数
- prepare_request 会把原始 request 转为 “可发送的 preparedrequest”
- 把预处理好的 preparedrequest 传给 send 方法
- 获取响应结果 - response
在preparedrequest方法中实现对cokie 的处理和装载。而真正处理request请求的底层工作由send实现。
如何实现自动重连功能
我们自定义的对象 autoauthsession中实现了auth_request 和request 方法。它们内部都实现了对重连功能的封装。
def auth_request(
self,
method: str | none = none,
url: str | none = none,
*args,
expected: callable[[response], bool] | none = none,
max_tries: int | none = none,
delay_unexpected: float | none = none,
log: str | none = none,
**kwargs,
) -> response:
该方法接收四个参数:expected, max_tries, delay_unexpected, log。这些参数同时也是autoauthsession的新属性。
下面这段代码是实现认证重连的主要逻辑:
for tries in range(1, 1 + max_tries):
resp = super().request(method, url, *args, **kwargs)
if expected(resp):
break
time.sleep(delay_unexpected)
else:
......
......
它实际上仍然是调用了父类session 的request方法,无非是加入了一个回调函数 expexted 用来判断响应结果是否达到预期,根据其状态决定是否重新发送请求。同时加入延时逻辑,防止速率过快。
else 后面主要是日志记录过程。
到此这篇关于浅析python如何自定义session认证方法的文章就介绍到这了,更多相关python自定义session认证内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论