Python脚本POST登录服务器失败,如何保存认证Cookie?
嘿,作为新手遇到这种Postman能跑但脚本不行的问题太正常了,别慌!咱们一步步来解决:
先找你当前脚本的核心问题
你收到500错误,大概率不是Cookie的问题(毕竟登录请求还没成功,还没拿到Cookie呢),而是请求格式不规范:
- 你手动把payload写成了JSON字符串,但没有告诉服务器这是JSON格式的请求体——Postman会自动帮你设置
Content-Type: application/json请求头,但你的Python脚本没做这件事,服务器没法解析你的请求,所以返回了500错误。 - 另外,手动拼接JSON字符串很容易出现语法错误,不如用Python字典让requests帮你处理序列化。
正确的解决方案:用Session自动管理Cookie+规范请求格式
requests的Session对象会自动帮你保存登录后拿到的Cookie,后续所有用这个Session发的请求都会自动带上认证Cookie,完美解决你后续请求的认证问题。
修改后的脚本长这样:
import requests # 创建一个Session对象,专门用来自动管理Cookie session = requests.Session() url = "http://172.125.169.21/api/user/login" # 用字典编写payload,比手动拼JSON字符串靠谱且不易出错 payload = { "name": "test5", "password": "Hello123" } # 用session发POST请求,json参数会自动完成:字典转JSON字符串+设置正确的Content-Type请求头 response = session.post(url, json=payload) # 查看登录响应结果 print("登录响应内容:") print(response.text) print("\n登录响应头:") print(response.headers) # ------------------- 后续认证请求示例 ------------------- # 比如你要访问需要登录权限的接口,直接用session发请求即可,Cookie会自动带上 # protected_url = "http://172.125.169.21/api/some-protected-endpoint" # protected_response = session.get(protected_url) # print(protected_response.text)
为什么这样改能解决问题?
session.post(url, json=payload):这个json参数是requests的贴心功能,它会自动把你的Python字典序列化成JSON字符串,同时在请求头里加上Content-Type: application/json,和Postman的行为完全一致,服务器就能正确解析你的请求了。Session对象:它会在登录成功后自动保存服务器返回的认证Cookie(比如sessionid或认证令牌),之后你用这个session发的任何GET/POST请求,都会自动把这些Cookie带上,不用你手动处理Cookie的存储和携带。
验证效果
运行修改后的脚本,应该能得到和Postman完全一致的成功响应:
{ "ErrorCode": 0, "Data": { "role": "admin", "_id": "7c9e7mdf4d249212282480zb", "name": "test5" } }
之后你需要访问需要认证的接口时,直接用这个session对象发请求就好,不用再操心Cookie的问题啦。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

