Python CLI发送POST请求登录Passport.js后如何维持会话状态?
问题根源
REST-client这类工具会自动处理响应里的Set-Cookie头,后续请求自动带上会话Cookie;但Python CLI的HTTP请求默认不会保存和复用Cookie,所以每次请求都是全新会话,自然无法维持登录状态。
解决办法
1. 用requests.Session自动管理会话
requests库的Session对象会自动保存登录响应的Cookie,后续请求自动携带,这是最省心的方式:
import requests # 初始化会话 session = requests.Session() # 执行登录 login_payload = {"username": "你的用户名", "password": "你的密码"} login_res = session.post("http://你的API域名/login", data=login_payload) if login_res.status_code == 200: print("登录成功") # 后续请求自动带会话Cookie protected_res = session.get("http://你的API域名/需要登录的接口") print(protected_res.json())
2. 手动提取并携带Cookie
如果不想用Session,可以手动提取登录响应里的会话Cookie(默认是connect.sid,取决于你express-session的name配置),然后在后续请求的头里加上:
import requests # 登录请求 login_payload = {"username": "你的用户名", "password": "你的密码"} login_res = requests.post("http://你的API域名/login", data=login_payload) # 提取会话Cookie session_cookie = login_res.cookies.get("connect.sid") # 后续请求手动加Cookie头 headers = {"Cookie": f"connect.sid={session_cookie}"} protected_res = requests.get("http://你的API域名/需要登录的接口", headers=headers) print(protected_res.json())
3. 确认Express端的会话配置
先确保你的express-session和跨域配置没问题:
- 跨域场景下,
cors要开启credentials: true,同时客户端请求要允许携带凭证(requests.Session默认会处理) express-session的cookie配置要合理,比如httpOnly、maxAge、domain(如果跨域的话)
Express端示例配置:
const session = require('express-session'); const cors = require('cors'); // 跨域配置 app.use(cors({ origin: "http://你的Python客户端所在地址", // 或者按需设置 credentials: true })); // 会话配置 app.use(session({ secret: "你的加密密钥", resave: false, saveUninitialized: false, cookie: { secure: false, // 生产环境建议开HTTPS并设为true httpOnly: true, maxAge: 86400000 // 会话有效期1天 } }));
关键提醒
- 确保Python请求的域名/IP和REST-client一致,避免Cookie的域不匹配导致无法携带
- 如果API用了HTTPS,Python请求要信任对应证书(生产环境别关验证)
- 检查
express-session的name配置,确保提取的Cookie名和配置一致
内容的提问来源于stack exchange,提问作者gotter
相关产品推荐
相关产品推荐

