如何复用requests.Session()?解决多次创建会话导致连接失效问题
问题分析与解决:requests.Session会话维持失败
核心错误原因
你每次执行不同操作时都新建了LoginLogout类的实例:
- 登录时创建的
login_var是一个带登录状态的会话实例,但执行update时又新建了update_prem——这是一个完全独立的新会话,没有任何登录状态,自然返回登录页内容。 - 你的思路是对的:用
requests.Session维持会话,让同一会话内的请求共享Cookie等登录状态,但实现时没做到复用同一个会话实例。
修正方案
1. 复用同一个会话实例
把会话实例提升到全局或更高作用域,确保登录、更新、退出操作都用同一个实例:
# 全局管理会话实例,避免每次操作新建 session_instance = None if switch_parameter == "login": session_instance = LoginLogout() session_instance.login(USER, PASSWORD, SERVER) # 这里可以直接用实例的会话对象验证,或者后续封装成类方法 print('IS IT OK ?', session_instance.s.get('.../login...')) elif switch_parameter == "start": start() elif switch_parameter == "stop": stop() elif switch_parameter == "update": if session_instance is not None: session_instance.update('...different/page...') else: print("请先完成登录") elif switch_parameter == "logout": if session_instance is not None: session_instance.logout() session_instance = None # 登出后清空实例 else: print("当前未登录,无需退出") else: pass
2. 优化类封装(可选,更规范)
把会话操作全部封装到类内部,避免外部直接访问self.s,同时增加登录状态判断:
import requests class LoginLogout: def __init__(self): self.s = requests.Session() self._is_logged_in = False # 私有变量标记登录状态 def login(self, user, password, server): payload_data = {'user': user, 'pass': password, 'server': server} response = self.s.post(LOGIN_LINK, payload_data) # 根据实际响应判断登录是否成功,比如状态码、响应内容 if response.status_code == 200: self._is_logged_in = True print(response) return self._is_logged_in def verify_login(self): response = self.s.get('.../login...') print('登录状态验证:', response) return response.status_code == 200 def update(self, updt_link): if not self._is_logged_in: print("未登录,无法执行更新操作") return print(self.s.get(updt_link)) def logout(self): if self._is_logged_in: response = self.s.get('...some webpage/user/logout...') self.s.close() self._is_logged_in = False print(response) else: print("当前未登录,无需退出")
调用优化后的类:
session_instance = None if switch_parameter == "login": session_instance = LoginLogout() session_instance.login(USER, PASSWORD, SERVER) session_instance.verify_login() elif switch_parameter == "update": if session_instance: session_instance.update('...different/page...') else: print("请先登录") # 其他分支逻辑同理
内容的提问来源于stack exchange,提问作者BedSon
相关产品推荐
相关产品推荐

