因为requests单次请求不保存set-cookie,导致后续请求缺失会话凭证;正确做法是使用session对象自动管理cookie,避免手动拼接或覆盖。

Requests发送带Cookie的请求时,为什么服务器返回401或跳转登录页?
因为没正确传递会话上下文。Requests本身不自动管理Cookie,requests.get()这种单次调用不会保存响应里的Set-Cookie头,后续请求自然没身份凭证。
正确做法是复用requests.Session()对象——它内置CookieJar,能自动处理Set-Cookie和后续请求的Cookie头。
- 先用
session.post()登录,触发服务器下发Cookie - 再用同一
session对象发后续请求,Cookie自动附带 - 不要手动拼接
headers={'Cookie': 'xxx'},容易漏字段、过期、签名失效
如何手动设置初始Cookie(比如绕过登录直接调试接口)?
某些场景下你已有有效的Cookie字符串(比如从浏览器开发者工具复制),想跳过登录流程直接请求。这时别用headers硬塞,而是走Requests的Cookie机制:
- 用
session.cookies.set()逐个设键值对:session.cookies.set('JSESSIONID', 'abc123') - 或传入字典:
session.cookies.update({'token': 'xyz', 'uid': '1001'}) - 避免直接赋值
session.cookies = requests.cookies.RequestsCookieJar()后手动add——易丢domain/path等属性
注意:手动设置的Cookie不会被自动更新,服务器返回新Set-Cookie时,Session仍会按规则合并,但原始手动值优先级低于服务端下发的同名Cookie。
Requests中Cookie相关参数和方法有哪些实际区别?
cookies参数(如requests.get(url, cookies={'a': 'b'}))只影响当次请求,且不解析domain/path,适合简单测试;而Session.cookies是持久化容器,支持完整RFC 6265语义。
-
session.cookies.get_dict()返回当前所有可发送的Cookie字典(不含过期/域不匹配的) -
session.cookies.clear()清空全部,但不清除Session其他状态(如adapter、auth) - 若需跨域携带Cookie,确保
session.get(url, allow_redirects=True),否则重定向后Cookie可能丢失
常见坑:用session.get(..., cookies={'x': 'y'})会覆盖Session已有的Cookie,而不是合并——这是Requests的设计,不是bug。
遇到“Cookie过期”或“Invalid signature”错误怎么办?
这类错误通常不是Requests的问题,而是服务端校验逻辑在起作用。Requests只是忠实地把Cookie发出去,但服务端可能检查:
- 时间戳是否在有效窗口内(比如Cookie含
exp=1717023600,本地时间已超) - 签名字段(如
_sig)是否匹配当前域名、路径、时间、密钥 - 是否启用了
HttpOnly或Secure标记,而你用HTTP协议访问HTTPS接口
调试建议:用print(session.cookies.get_dict())确认当前持有的Cookie内容;抓包对比浏览器请求,看是否有额外Header(如X-Requested-With)或参数参与签名计算。
真正复杂的Cookie策略(比如分段加密、动态salt)往往需要逆向服务端逻辑,Requests只能负责传输,没法替你解密或生成合法值。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











