0

0

Python requests 如何在重试时保留原 Session 的 cookie

冷漠man

冷漠man

发布时间:2026-01-23 20:42:11

|

518人浏览过

|

来源于php中文网

原创

不会丢cookie,前提是复用同一session实例;requests重试机制本身不主动清除session.cookies,常见丢失源于误新建session、手动清空cookies或线程不安全操作。

python requests 如何在重试时保留原 session 的 cookie

requests 重试机制默认会丢 cookie 吗? 是的。requests.adapters.HTTPAdapter 的重试逻辑(基于 urllib3.Retry)在底层重建连接时,**不会主动丢弃 Session 对象里的 cookie**,但前提是:你得用同一个 Session 实例发起重试请求。真正出问题的地方,往往是你误用了“重试后新建 Session”或手动调用了 session.cookies.clear(),又或者在重试回调里擅自替换了 session.cookies

关键点在于:Session 是有状态的,cookie 存在 session.cookies(一个 RequestsCookieJar 实例)里,只要不显式清空、不换 session、不覆盖 cookiejar,重试请求自然携带原有 cookie。

用 urllib3.Retry 配合 Session 实现带 cookie 的重试 这是最常用也最稳妥的方式。重点是把重试策略挂到 session 的 adapter 上,而不是自己写 for 循环重发请求。
  • 重试配置必须通过 HTTPAdapter 注入,不能靠捕获异常后手动重发(那样容易漏掉 cookie 或 headers)
  • Retryraise_on_redirect=Falseraise_on_status=False 要设为 False(默认就是),否则重定向或 5xx 会直接抛异常,中断重试流程
  • 若服务端返回 401/403 且需要重新登录,重试机制本身不会自动刷新 cookie —— 这属于业务逻辑,得你自己在响应钩子里处理
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
<p>session = requests.Session()
retry_strategy = Retry(
total=3,
backoff_factor=1,
status_forcelist=[429, 500, 502, 503, 504],
allowed_methods=["HEAD", "GET", "OPTIONS", "POST"]  # 注意:默认不重试 POST,需显式声明
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)</p><h1>登录后 cookie 已存入 session.cookies</h1><p>session.post("<a href="https://www.php.cn/link/d9976f1c2c0c972d1cee0c3647cbd194">https://www.php.cn/link/d9976f1c2c0c972d1cee0c3647cbd194</a>", data={"u": "a", "p": "b"})</p><h1>后续请求(含自动重试)都会带上登录态 cookie</h1><p>resp = session.get("<a href="https://www.php.cn/link/fad68ee497f1cf9108b630e7ce630e6c">https://www.php.cn/link/fad68ee497f1cf9108b630e7ce630e6c</a>")</p><div class="aritcle_card flexRow">
                                                        <div class="artcardd flexRow">
                                                                <a class="aritcle_card_img" href="/ai/1780" title="艺映AI"><img
                                                                                src="https://img.php.cn/upload/ai_manual/000/000/000/175680358718927.png" alt="艺映AI"  onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
                                                                <div class="aritcle_card_info flexColumn">
                                                                        <a href="/ai/1780" title="艺映AI">艺映AI</a>
                                                                        <p>艺映AI - 免费AI视频创作工具</p>
                                                                </div>
                                                                <a href="/ai/1780" title="艺映AI" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
                                                        </div>
                                                </div>

为什么有时重试后 cookie 没了?常见踩坑点 不是重试机制清 cookie,而是你无意中破坏了 session 的连续性:
  • 在重试回调(如 session.hooks["response"])里写了 session.cookies = requests.cookies.RequestsCookieJar() —— 直接替换了整个 cookiejar
  • session.get(url, cookies={...}) 显式传入 cookies 参数:这会**临时覆盖** session.cookies,且仅对本次请求生效;但若你在重试期间反复传空 dict,可能干扰状态
  • 跨线程/协程共享同一个 Session 实例,而 RequestsCookieJar 不是线程安全的,导致 cookie 被意外清空或覆盖
  • 服务端返回 Set-CookieExpires=PastMax-Age=0session.cookies 会在下次请求前自动清理对应条目 —— 看起来像“丢了”,其实是被标准逻辑删了

需要动态更新 cookie 时怎么安全重试? 比如 token 过期后要先刷新再重放原请求。这时候不能依赖内置重试,得自己控制流程,但要确保原 session 状态可恢复:
  • 把原始请求参数(method、url、kwargs)存下来,不要在重试前修改 session.cookies
  • 刷新 token 后,用新 cookie 覆盖 session.cookies.set(),而不是全量替换
  • 避免在刷新过程中调用 session.cookies.clear(),哪怕只有一行
  • 如果必须重建 cookiejar(极少见),用 session.cookies = copy.deepcopy(old_jar),别用空构造

真正的难点不在“怎么让重试带 cookie”,而在于厘清 cookie 更新的时机和范围 —— 多数故障都源于把 session 当成无状态工具,而非一个需要小心维护的状态容器。

立即学习Python免费学习笔记(深入)”;

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6499

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

368

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

444

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

334

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

775

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6582

2023.09.14

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号