使用Requests库获取csrftoken成功却无法获取session id的原因
为什么requests库能获取csrftoken但拿不到session_id?
可能的原因及解决办法:
- 登录请求未通过验证:服务器仅在登录成功后才会生成session_id。先检查响应状态码(比如执行
print(post.status_code)),若返回200大概率是登录失败。对比浏览器发送的表单数据,确认this_is_the_login_form等参数的值是否正确(比如浏览器中该字段可能是固定值"1",需确保代码里正确赋值)。 - Session对象未连续复用:必须用同一个
session对象先GET登录页面(获取csrftoken和初始Cookie),再POST登录请求。中途新建session会丢失上下文,导致服务器不生成session_id。 - 请求头或Cookie缺失:浏览器会自动带上之前的Cookie,requests的session默认会处理,但手动修改headers或Cookie可能导致必要字段丢失。可对比浏览器的请求头、Cookie与代码中的内容,确保一致。
- 服务器未返回session_id:打印响应的
Set-Cookie头(print(post.headers.get('Set-Cookie'))),若没有session_id相关内容,说明登录请求未被服务器认可;若有但session.cookies中不存在,可能是Cookie的domain/path设置问题,需手动查看处理。 - 证书验证异常:使用
verify=False可能导致服务器返回错误页面而非登录成功响应,建议尝试导入对应证书信任后再测试。
代码优化提示:
确保POST登录请求前,已用同一个session对象访问过登录页面:
session = requests.Session() # 先GET登录页面,获取csrftoken和初始Cookie login_page = session.get("https://www.postgresql.org/account/login/?next=/account/") # 从响应中提取csrftoken(可通过BeautifulSoup或正则提取) csrfmiddlewaretoken = ... # 再执行登录POST请求 post = session.post("https://www.postgresql.org/account/login/", data=payload, headers=headers)
内容的提问来源于stack exchange,提问作者STBA
相关产品推荐
相关产品推荐

