关闭浏览器站点标签页时如何关停Django服务器及配置后台运行
Django相关问题解答
1. 所有访问站点的浏览器标签页关闭后自动关停Django服务器的实现方案
你之前用的beforeunload事件从根上就不靠谱:现代浏览器对这个事件的限制极多,刷新、跨页跳转、关闭标签页的触发逻辑完全不统一,而且为了防止页面阻塞关闭流程,事件里的异步请求(比如通知后端关服务的请求)大概率会被浏览器直接丢弃,根本到不了后端,测出来刷新触发、关标签页不触发是正常现象,不是你代码写的有问题。
要实现“所有标签页关了自动停服务”,用前端心跳+后端计数的方案就可以,注意这个方案只适合本地开发的runserver环境,生产环境绝对禁止使用:
- 前端侧:每个标签页打开的时候,在
sessionStorage里生成一个唯一的标签ID(标签页关闭后sessionStorage会自动清空,不会多标签页串数据),然后每隔15秒给后端发一个极轻量的心跳请求,带上这个标签ID - 后端侧:在Django里维护一个全局字典,存每个在线标签ID的最后心跳时间,同时启动一个后台巡检线程,每30秒扫一次这个字典,把超过30秒没上报心跳的ID删掉
- 巡检逻辑一旦发现字典里没有任何在线标签ID,直接执行
os.kill(os.getpid(), signal.SIGTERM)就能把当前Django开发服务进程关掉
2. 让Django服务器后台运行、不占用终端窗口的实现方法
后台运行Django的操作非常简单,按自己的操作系统选对应命令即可:
- Windows环境:启动时执行
start /b python manage.py runserver,服务会直接在后台运行,需要关停的时候去任务管理器结束对应的Python进程即可 - macOS/Linux环境:临时后台运行直接执行
python manage.py runserver &,启动后终端会返回进程PID,需要关停的时候执行kill <对应PID>就行;如果希望关闭终端后服务也不退出,就执行nohup python manage.py runserver > django_log.log 2>&1 &,所有运行日志会存在当前目录下的django_log.log文件里,方便排查问题
注意:所有涉及前端页面关闭触发服务端操作的逻辑,都不要依赖
beforeunload/unload事件,这类事件的兼容性和可靠性从设计之初就没有保障,心跳检测是目前唯一稳定可落地的方案。
内容的提问来源于stack exchange,提问作者CodeView
相关产品推荐
相关产品推荐

