最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Python如何自定義session認(rèn)證方法

 更新時(shí)間:2026年03月10日 09:23:43   作者:溪海莘  
這篇文章主要為大家詳細(xì)介紹了Python如何自定義session認(rèn)證方法以實(shí)現(xiàn)會(huì)話(huà)失效自動(dòng)重連,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

為什么不使用request而使用session

關(guān)鍵原因在于你所發(fā)送的網(wǎng)絡(luò)請(qǐng)求是否需要"記憶性",如果需要那么使用requests.session模塊。它會(huì)自動(dòng)為開(kāi)發(fā)者維護(hù)在平臺(tái)上的認(rèn)證和登錄信息,能夠記錄客戶(hù)端和服務(wù)器交互過(guò)程中產(chǎn)生的Cokie信息。

我們定義一個(gè)AutoAuthSession類(lèi)對(duì)象,它繼承自requests.Session模塊。

為什么需要自定義Session對(duì)象

因?yàn)槠脚_(tái)的認(rèn)證有一個(gè)過(guò)期時(shí)間限制。為了確保session對(duì)象在使用API過(guò)程不會(huì)失效,我們希望其能自行檢測(cè),并在Cokie失效后自動(dòng)實(shí)現(xiàn)登錄。

session.request 實(shí)現(xiàn)了什么

通過(guò)查看requests 的源代碼,我們了解到requests.Session 繼承自 SessionRedirectMixin。這個(gè)類(lèi)有6個(gè)實(shí)例方法。主要實(shí)現(xiàn)重定向?qū)?yīng)的功能。

其次,Session繼承SessionRedirectMixin( 實(shí)際上遵循Mixin設(shè)計(jì)模式,父類(lèi)提供工具方法 )。Session中定義了request方法,它是一個(gè)關(guān)鍵。具體代碼如下:

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 請(qǐng)求的全流程:從接收用戶(hù)傳入的請(qǐng)求參數(shù),到構(gòu)建、預(yù)處理請(qǐng)求,再到發(fā)送請(qǐng)求并返回響應(yīng),把復(fù)雜的 HTTP 協(xié)議細(xì)節(jié)抽象成簡(jiǎn)單的參數(shù)調(diào)用。

  • 把用戶(hù)傳入的零散參數(shù)封裝成一個(gè) Request 類(lèi)實(shí)例 - 僅存儲(chǔ)參數(shù)
  • prepare_request 會(huì)把原始 Request 轉(zhuǎn)為 “可發(fā)送的 PreparedRequest”
  • 把預(yù)處理好的 PreparedRequest 傳給 send 方法
  • 獲取響應(yīng)結(jié)果 - response

在PreparedRequest方法中實(shí)現(xiàn)對(duì)cokie 的處理和裝載。而真正處理request請(qǐng)求的底層工作由send實(shí)現(xiàn)。

如何實(shí)現(xiàn)自動(dòng)重連功能

我們自定義的對(duì)象 AutoAuthSession中實(shí)現(xiàn)了auth_request 和request 方法。它們內(nèi)部都實(shí)現(xiàn)了對(duì)重連功能的封裝。

    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:

該方法接收四個(gè)參數(shù):expected, max_tries, delay_unexpected, log。這些參數(shù)同時(shí)也是AutoAuthSession的新屬性。

下面這段代碼是實(shí)現(xiàn)認(rèn)證重連的主要邏輯:

        for tries in range(1, 1 + max_tries):
            resp = super().request(method, url, *args, **kwargs)
            if expected(resp):
                break
            time.sleep(delay_unexpected)
        else:
        		......
        		......

它實(shí)際上仍然是調(diào)用了父類(lèi)Session 的request方法,無(wú)非是加入了一個(gè)回調(diào)函數(shù) expexted 用來(lái)判斷響應(yīng)結(jié)果是否達(dá)到預(yù)期,根據(jù)其狀態(tài)決定是否重新發(fā)送請(qǐng)求。同時(shí)加入延時(shí)邏輯,防止速率過(guò)快。

else 后面主要是日志記錄過(guò)程。

到此這篇關(guān)于淺析Python如何自定義session認(rèn)證方法的文章就介紹到這了,更多相關(guān)Python自定義session認(rèn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

方正县| 乌什县| 蓬安县| 同江市| 东山县| 靖安县| 资阳市| 无棣县| 株洲县| 集贤县| 娱乐| 凤山市| 富平县| 大埔县| 泰兴市| 图们市| 西乌珠穆沁旗| 镇雄县| 怀集县| 河间市| 广宁县| 平昌县| 清河县| 平利县| 六枝特区| 衡阳市| 新乐市| 广州市| 浑源县| 衡山县| 漾濞| 海丰县| 五家渠市| 惠安县| 霍州市| 渑池县| 清水县| 山东省| 隆安县| 景泰县| 微博|