You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python requests使用session登录后后续请求提示未登录如何解决

问题排查与解决方案

1. 先确认登录请求真的完成了凭证下发

  • 校验登录POST请求的返回状态:打印response.status_code和response.text,确认响应内容包含登录成功的标识(比如用户昵称、登录成功提示),而非隐形的校验失败提示
  • 打印session.cookies,确认服务器下发的登录凭证(如sessionid、JSESSIONID、auth_token等字段)确实被session对象存储

2. 补充后续请求的动态校验参数

大部分站点除登录接口外,后续所有POST请求都会要求携带新的CSRF令牌,你之前提取的csrf_token仅适用于登录接口,进入URL_2页面后站点会更新csrf凭证:

  • 从session.get(URL_2)的响应内容中提取新的csrf_token,可通过正则匹配页面meta标签、隐藏表单字段,或者从响应cookie中提取
  • 把新的csrf_token加入后续POST请求的参数,或者请求头的X-CSRFToken字段(根据站点实际规则调整)

3. 补全请求头的必要校验字段

  • 补充Referer头:POST提交到URL_2时,Referer值设为URL_2的页面地址,大部分站点会校验请求来源防止跨站伪造
  • 确认User-Agent头和浏览器一致,且全程保持统一,避免站点识别为自动化请求清空会话

4. 处理登录跳转逻辑

如果登录接口是302跳转逻辑,给登录POST请求添加allow_redirects=True参数,让session跟随跳转完成完整的登录流程,拿到最终的登录态cookie:

response = session.post(URL, login_data, headers=headers, allow_redirects=True)

调整后的示例代码

import requests
import re

session = requests.Session()
# 统一请求头可以直接挂载到session,不用每次请求传
session.headers = {
    "User-Agent": "你的浏览器UA",
    "Referer": URL
}

# 登录页请求
response = session.get(URL)
# 提取登录用csrf
token = re.search(r'csrf_token" value="(.*?)"', response.text).group(1)
login_data = {"username": '你的账号', "password": '你的密码', "csrf_token":token}

# 提交登录,允许跳转
response = session.post(URL, data=login_data, allow_redirects=True)
# 校验登录结果
if "欢迎" in response.text or "username" in response.text:
    print("登录成功")
else:
    print("登录失败", response.text)
    exit()

# 请求业务页
response = session.get(URL_2)
# 提取业务页新的csrf
new_csrf = re.search(r'csrf_token" value="(.*?)"', response.text).group(1)
# 给业务请求头加Referer
session.headers["Referer"] = URL_2

Data = {"csrf_token": new_csrf, "你要提交的其他字段": "值"}
response = session.post(URL_2, data=Data)
print(response.text)

内容的提问来源于stack exchange,提问作者wait3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:09:00