python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python自定义session认证

浅析Python如何自定义session认证方法

作者:溪海莘

这篇文章主要为大家详细介绍了Python如何自定义session认证方法以实现会话失效自动重连,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

为什么不使用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 协议细节抽象成简单的参数调用。

在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认证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文