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

 更新时间:2026年03月10日 09:23:43   作者:溪海莘  
这篇文章主要为大家详细介绍了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 协议细节抽象成简单的参数调用。

  • 把用户传入的零散参数封装成一个 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认证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在服务器上安装python3.8.2环境的教程详解

    在服务器上安装python3.8.2环境的教程详解

    这篇文章主要介绍了在服务器上安装python3.8.2环境的教程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Python利用shutil模块实现文件的裁剪与压缩

    Python利用shutil模块实现文件的裁剪与压缩

    shutil可以简单地理解为sh+util ,shell工具的意思。shutil模块是对os模块的补充,主要针对文件的拷贝、删除、移动、压缩和解压操作。本文将利用这一模块实现文件的裁剪、压缩与解压缩,需要的可以参考一下
    2022-05-05
  • Python面向对象编程之封装的艺术你了解吗

    Python面向对象编程之封装的艺术你了解吗

    这篇文章主要为大家详细介绍了Python面向对象编程之封装的艺术,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • 教你使用conda虚拟环境管理(创建、激活、重命名、删除虚拟环境)

    教你使用conda虚拟环境管理(创建、激活、重命名、删除虚拟环境)

    conda是一个强大的Python包管理和环境管理工具,它可以帮助我们轻松地安装、更新、卸载和切换不同版本的Python和各种第三方库,本文就来介绍一下conda虚拟环境管理(创建、激活、重命名、删除虚拟环境),感兴趣的可以了解一下
    2024-01-01
  • Python爬取门户论坛评论浅谈Python未来发展方向

    Python爬取门户论坛评论浅谈Python未来发展方向

    这篇文章主要介绍了如何实现Python爬取门户论坛评论,附含图片示例代码,讲解了详细的操作过程,有需要的的朋友可以借鉴参考下,希望可以有所帮助
    2021-09-09
  • Python实现word2Vec model过程解析

    Python实现word2Vec model过程解析

    这篇文章主要介绍了Python实现word2Vec model过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • echarts动态获取Django数据的实现示例

    echarts动态获取Django数据的实现示例

    本文主要介绍了echarts动态获取Django数据的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • python格式的Caffe图片数据均值计算学习

    python格式的Caffe图片数据均值计算学习

    这篇文章主要为大家介绍了python格式的Caffe图片数据均值计算学习示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 通过Python绘制中国结的示例代码

    通过Python绘制中国结的示例代码

    再过不久就要到新年了,所以这篇文章将为大家介绍一下如何通过Python代码绘制一个中国结,文中的示例代码讲解详细,感兴趣的可以动手试一试
    2022-01-01
  • 基于pyinstaller超级加密操作(加壳和转c)

    基于pyinstaller超级加密操作(加壳和转c)

    这篇文章主要介绍了基于pyinstaller超级加密操作 (加壳和转c),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03

最新评论