django使用accept_websocket,捕获浏览器连接状态

dwebsocket下载地址

浏览器退出时会报错异常,这是websocket模块的问题

我之前flask用的websocket,浏览器确实会退出,
现在用django的dwebsocket 0.4.2
这次在浏览器界面退出的时候,也就是前端断开这个socket连接,但是并没有报错,业务是时时推送,我的接口一直处于死循环状态,并且随界面切换,连接数量不断增大。线程开启没有回收,导致异步IO操作增多,就单进程来说python的线程安全问题,会导致程序一直在等待执行,从而导致内存泄漏,浪费资源,导致程序崩溃。

这是我一开始的代码

@accept_websocket
def alarm_massage_push_socket(request):
  	if request.is_websocket():
            while 1:
				request.websocket.send(json_data)
				time.sleep(5)

socket底层封装了tcp/ip,所以socket是可以正常进行通信,简单一问一答来解决这个问题。
先让前端连接socket的时候发送一个指定确认的ACK,
再用wait堵塞的方式获取前端给我的值代码如下:

@accept_websocket
def alarm_massage_push_socket(request):
	if request.is_websocket():
		while 1:
			message = request.websocket.wait()
			if message != 88:
				request.websocket.send(json_data)
				time.sleep(5)
			except:
				print('关闭socket连接')

这样的情况下,我收到前端的值,就可以判断是不是可以退出了。
并且在这样wait()的状态下,它会自动检测是否超时,是否断开。
当发现异常断开,超时,没有连接状态的时候他会自动报错,这样和我
一开始使用flask的流程就一样了。
所以当浏览器非正常关闭时候也可以正常的退出循环,释放资源
最后代码如下:

@accept_websocket
def alarm_massage_push_socket(request):
	try
		if request.is_websocket():
			while 1:
				message = request.websocket.wait()
				if message != 88:
					request.websocket.send(json_data)
					time.sleep(5)
				except:
					print('关闭socket连接')
	except:
		print('浏览器异常退出了')
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端工匠之道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值