一: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
注釋:
通過裝飾器:@accept_websocket來讓view函數的即可以接受http協議也可以接收wss 協議及websocket。
通過while死循環來,不斷等待接收前端發送的消息和發送消息。
通過time模塊來控制循環速度。
前端通過websocket 給后端發送消息和接收消息。