python 的 websocket的使用
一:websocket使用场景
https://django-websocket-redis.readthedocs.io/en/latest/running.html
最典型的使用场景:聊天。
还有就是:当我们做异步处理的任务的时候,之前采用的长轮询或者计时器的方法,但是这种方法的开销和性能比较差。对于网页的性能的不是很好。
而html5的时候 支持websocket和python 本身也支持websocket,由于websocket的特性和开销更小,性能更好。所以采用websocket方式。接下来的django中,会开发一个叫做channels。这种方式更为不错。
今天介绍websocket。至于websocket的好处,网上的介绍一大堆,可以自己百度看,不做累述。
二 使用:
简单介绍下代码:前端通过jquery的$() 来采集页面的IP信息,然后通过html5的websocket跟后端python通信,后端通过传过的IP信息,建立ansible任务,执行对应的采集脚本,隔几秒返回给前端,
前端将结果替换到相应的页面,来更新前端的监控信息。
1、python 安装websocket:
1 pip2.7 install dwebsocket
前端代码:
1 if (window.s) {
2 window.s.close()
3 }
4 /*创建socket连接*/
5 var socket = new WebSocket("ws://192.168.31.206:1601/get_monitor/");
6 socket.onopen = function () {
7 console.log('WebSocket open');//成功连接上Websocket
8 socket.send(msg)
9 };
10 socket.onmessage = function (e) {
11 data=JSON.parse(e.data);
12 console.log('message: ' + e.data);//打印出服务端返回过来的数据
13 $.each(data['success_ip'],
14 function(key,val){
15 $( 'td:contains('+key+')').siblings().find('.cpu_val').text(val[0]);
16 $( 'td:contains('+key+')').siblings().find('.io_val').text(val[2]+'m');
17 $( 'td:contains('+key+')').siblings().find('.disk_val').text(val[1]+'%');
18 }
19
20 )
21 };
22 // Call onopen directly if socket is already open
23 if (socket.readyState == WebSocket.OPEN) socket.onopen();
24 window.s = socket;
25
26
27 }
后端代码:
1 @accept_websocket
2 def get_monitor(request):#get monior infomation func.
3 import time
4 if request.is_websocket():
5 while True:
6 if request.websocket.has_messages():
7 msg=request.websocket.read()
8 ip,task_id=msg.split(':')
9 ip_list=[]
10 ip_list.append(ip)
11 print ip_list,task_id
12 host_obj=models.Host.objects.filter(task_id=task_id).first()
13 user=host_obj.sys_user
14 pwd=host_obj.sys_pwd
15 while True:
16 time.sleep(2)
17 task_obj=task_excu.Task_Runner(ip_list, user, pwd)
18 ret=task_obj.get_monitor()
19 for i,v in ret['success_ip'].items():
20 v=v.split('\n')
21 ret['success_ip'][i]=v
22 request.websocket.send(json.dumps(ret))
23 else:
24 time.sleep(1)
25 continue
也可以看看GoEasy文库的其他资料。