Flask与Selenium集成时出现Invalid Session ID错误求助
解决Flask调用Selenium时出现的Invalid Session ID错误
问题根源
核心问题是Selenium实例初始化时机与Flask运行环境不兼容:在Flask启动前就创建了RoomBooker实例(即Selenium驱动会话),但当Flask处理请求时,这个提前创建的会话可能已失效,或因进程/上下文隔离导致无法正常复用。
解决方案
1. 延迟初始化Selenium实例
不在Flask启动前提前创建RoomBooker,改为首次处理请求时初始化,且每次使用前验证会话有效性:
修改RoomScheduler类,实现延迟加载和会话校验:
class RoomScheduler: def __init__(self): self.booker = None def _get_valid_booker(self): # 检查booker是否存在,或会话是否有效 if self.booker is None or not self._is_session_active(): # 重新创建Selenium实例 self.booker = RoomBooker() return self.booker def _is_session_active(self): try: # 通过简单操作验证会话是否有效 self.booker.driver.current_url return True except Exception: # 捕获Invalid Session ID或其他会话失效异常 return False def valid_task(self): # 获取有效的booker实例 booker = self._get_valid_booker() # 执行登录等交互操作 # ... return "任务执行完成"
2. 调整Flask中实例的创建时机
将RoomScheduler的初始化移到if __name__ == '__main__'块内,避免在模块导入阶段提前创建Selenium实例:
if __name__ == '__main__': signal.signal(signal.SIGINT, keyboard_interrupt_handler) logging.basicConfig(filename='app.log', level=logging.INFO,filemode='w', format='%(asctime)s - %(levelname)s - %(message)s') logger = logging.getLogger('werkzeug') handler = logging.StreamHandler() logger.addHandler(handler) # 延迟初始化scheduler,避免提前创建Selenium实例 scheduler = RoomScheduler(booker=None) scheduler.process_file() host = host port = 5000 url = f'http://{host}:{port}/' webbrowser.open(url) app.run(host=host, port=port, debug=False, use_reloader=False)
3. 优化Selenium类的会话管理
在RoomBooker类中添加会话销毁逻辑,确保程序退出时正确关闭驱动:
class RoomBooker: def __init__(self): self.logged_in = False self.service = Service(executable_path=r"./chromedriver/chromedriver.exe") self.options = webdriver.ChromeOptions() # 建议关闭detach,避免会话游离 # self.options.add_experimental_option("detach", True) self.driver = webdriver.Chrome(service=self.service, options=self.options) self.driver.get("url") def close(self): try: self.driver.quit() except Exception: pass
然后在Flask的退出信号处理中调用关闭方法:
def keyboard_interrupt_handler(signal_num, frame): if scheduler.booker: scheduler.booker.close() exit(0)
关键说明
- 提前初始化的Selenium会话可能因闲置超时、进程上下文变化等原因失效,延迟初始化能确保每次请求使用有效会话。
- 会话有效性校验可自动处理会话过期情况,无需手动重启服务。
- 关闭
detach=True选项,避免浏览器与驱动解除关联导致的会话管理混乱。
内容的提问来源于stack exchange,提问作者Ten Tides
相关产品推荐
相关产品推荐

