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

 注釋:

      通過裝飾器:@accept_websocket來讓view函數的即可以接受http協議也可以接收wss 協議及websocket。

      通過while死循環來,不斷等待接收前端發送的消息和發送消息。

      通過time模塊來控制循環速度。

      前端通過websocket 給后端發送消息和接收消息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM