1. 程式人生 > >python+flask+socket-io+echarts資料視覺化

python+flask+socket-io+echarts資料視覺化

檢視本機python版本

安裝psutil

       開啟window power shell安裝psutil

       PSC:\Users\space> pip install psutil

       Collectingpsutil

         Downloadinghttps://files.pythonhosted.org/packages/c6/bf/09b13c17f54f0004ccb43cc1c2d36bab2eb75f471564b7856749dcaf62c3/psutil-5.4.5-cp35-cp35m-win_amd64.whl(222kB)

           100% |████████████████████████████████|225kB 714kB/s

       Installingcollected packages: psutil

       Successfullyinstalled psutil-5.4.5

       Youare using pip version 8.1.1, however version 10.0.1 is available.

       Youshould consider upgrading via the 'python -m pip install --upgrade pip' command.

安裝flask

       PSC:\Users\space> pip install flask

       Collectingflask

         Downloadinghttps://files.pythonhosted.org/packages/77/32/e3597cb19ffffe724ad4bf0beca4153419918e7fa4ba6a34b04ee4da3371/Flask-0.12.2-py2.py3-none-any.whl(83kB)

           100% |████████████████████████████████|92kB 238kB/s

       Collectingitsdangerous>=0.21 (from flask)

         Downloadinghttps://files.pythonhosted.org/packages/dc/b4/a60bcdba945c00f6d608d8975131ab3f25b22f2bcfe1dab221165194b2d4/itsdangerous-0.24.tar.gz(46kB)

           100% |████████████████████████████████|51kB 374kB/s

       CollectingJinja2>=2.4 (from flask)

         Downloadinghttps://files.pythonhosted.org/packages/7f/ff/ae64bacdfc95f27a016a7bed8e8686763ba4d277a78ca76f32659220a731/Jinja2-2.10-py2.py3-none-any.whl(126kB)

           100% |████████████████████████████████|133kB 453kB/s

       Collectingclick>=2.0 (from flask)

         Downloadinghttps://files.pythonhosted.org/packages/34/c1/8806f99713ddb993c5366c362b2f908f18269f8d792aff1abfd700775a77/click-6.7-py2.py3-none-any.whl(71kB)

           100% |████████████████████████████████|71kB 314kB/s

       CollectingWerkzeug>=0.7 (from flask)

         Downloadinghttps://files.pythonhosted.org/packages/20/c4/12e3e56473e52375aa29c4764e70d1b8f3efa6682bef8d0aae04fe335243/Werkzeug-0.14.1-py2.py3-none-any.whl(322kB)

           100% |████████████████████████████████|327kB 198kB/s

       CollectingMarkupSafe>=0.23 (from Jinja2>=2.4->flask)

         Downloadinghttps://files.pythonhosted.org/packages/4d/de/32d741db316d8fdb7680822dd37001ef7a448255de9699ab4bfcbdf4172b/MarkupSafe-1.0.tar.gz

       Installingcollected packages: itsdangerous, MarkupSafe, Jinja2, click, Werkzeug, flask

         Running setup.py install for itsdangerous ...done

         Running setup.py install for MarkupSafe ...done

       Successfullyinstalled Jinja2-2.10 MarkupSafe-1.0 Werkzeug-0.14.1 click-6.7 flask-0.12.2itsdangerous-0.24

       Youare using pip version 8.1.1, however version 10.0.1 is available.

       Youshould consider upgrading via the 'python -m pip install --upgrade pip'command.

安裝flask-socketio

       pipinstall flask-socketio

更新pip

       python-m pip install --upgrade pip

使用flask

       開啟pycharm,新建一個工程

       建立一個.py檔案

       建立一個資料夾,名字叫 templates (不能改成別的)

       在該資料夾下建立一個.html檔案

       開啟.py檔案

              fromflask import Flask, render_template

              fromflask_socketio import SocketIO

              app= Flask(__name__)

              app.config['SECRET_KEY']= 'secret!'

              socketio= SocketIO(app)

              @app.route('/')

              defindex():

                  return render_template('index.html')

              if__name__ == '__main__':

                  socketio.run(app)

       開啟.html檔案

              <!DOCTYPEhtml>

              <htmllang="en">

              <head>

                  <meta charset="UTF-8">

                  <title>Title</title>

              </head>

              <scripttype="text/javascript"src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js"></script>

              <body>

              <a>wbcbwjcwcw</a>

              </body>

              <scripttype="text/javascript" charset="utf-8">

                  var socket = io.connect('http://' +document.domain + ':' + location.port+'/');

                  socket.on('connect', function() {

                      socket.emit('my event', {data: 'I\'mconnected!'});

                  });

              </script>

              </html>

              【注意】

              //cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js一定要確保能用,之前用的1.0.3怎麼都打不開網頁,也可以把該檔案下載下來

socket-io如何傳遞資料給echarts

       搭建flask socket-io基本框架

              fromflask import Flask, render_template

              fromflask_socketio import SocketIO

              app= Flask(__name__)

              app.config['SECRET_KEY']= 'secret!'

              socketio= SocketIO(app)

              @app.route('/')

              defindex():

                  return render_template('index.html')

              if__name__ == '__main__':

                  socketio.run(app)

              這樣一啟動flask就會進入index.html,這個跳轉是由@app.route('/')下的函式實現的

       在html頁面中新增echarts

              首先引入echarts需要的js檔案,可以連結網路上的也可以使用本地的

                         <script type="text/javascript"src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>

                         <script type="text/javascript"src="//cdn.bootcss.com/socket.io/1.5.1/socket.io.min.js"></script>

                         <scriptsrc="theme/chalk.js"></script>

                         <!-- ECharts 3 引入 -->

                         <scriptsrc="http://echarts.baidu.com/dist/echarts.js"></script>

              然後建立一個div,確定div的id

                   <divid="main" style="height:300px;border:1px solid#ccc;padding:10px;"></div>

              然後在script標籤內新增echarts

                     這是一個柱狀圖

                             <scripttype="text/javascript">

                             // 基於準備好的dom,初始化echarts例項

                             var myChart1 =echarts.init(document.getElementById('main'),'dark');

                             // 指定圖表的配置項和資料

                             var option = {

                                 title: {

                                     text: 'ECharts 入門示例'

                                 },

                                 tooltip: {},

                                 legend: {

                                     data:['銷量']

                                 },

                                 xAxis: {

                                     data: ["襯衫","羊毛衫","雪紡衫","褲子","高跟鞋","襪子"]

                                 },

                                 yAxis: {},

                                 series: [{

                                     name: '銷量',

                                     type: 'bar',

                                     data: [5, 20, 36, 10, 10, 20]

                                 }]

                             };

                             // 使用剛指定的配置項和資料顯示圖表。

                             myChart1.setOption(option);

                         </script>

                     其中document.getElementById('main')中的main就是之前div的id,通過這個設定,圖表就會知道要把自己放到哪個div中;後面的dark是預設主題之一,可以自己自定義主題,具體方法官網有,不再介紹

       經過上面兩步啟動flask後就會在localhost:5000網頁上看到一個柱狀圖,不過這個柱狀圖是靜態的不能接收後臺資料動態改變

       現在在.py檔案中新增一個執行緒,用來與前端交互發送資料

              首先新增

              #與前端建立 socket 連線後,啟動後臺執行緒

              @socketio.on('connect',namespace='/test')

              然後在該句下面新增自己的函式來啟動一個後臺執行緒

                     thread= socketio.start_background_task(target=background_thread)

                     其中background_thread即是要實現的後臺處理函式

              然後建立background_thread函式

                     在該函式中實現將資料發到前端

                         while True:

                             socketio.sleep(1)

                             k = random.randint(0, 100)      //這裡產生一個隨機數

                             socketio.emit('server_other',    //這裡的server_other是前端定義的用來確定傳送給哪個

                                           {'data': [k]},      //這裡面放大就是要傳送的資料

                                           namespace='/test')      //這是名稱空間,前端有這個後端就要實現

              然後在html檔案中新增接收資料的函式

                              // 建立socket連線,等待伺服器“推送”資料,用回撥函式更新圖表

                             $(document).ready(function() {

                             namespace = '/test';      //這就是使用的名稱空間,在後端用@socketio.on('connect',namespace='/test')實現

                             var socket =io.connect(location.protocol + '//' + document.domain + ':' + location.port +namespace);

                             socket.on('server_other', function(res){  //後端使用socketio.emit('server_other',傳送的資料會由這個接收

                                 update_mychart2(res);         //然後接收到後臺資料res後,會呼叫update_mychart2(res)將資料更新到圖表

                                 });

                              });

              將接收到的資料更新到圖表

                         var update_mychart2 = function (res) {//res是json格式的response物件

                             valu = res.data[0]      //取出後臺傳送的資料

                             option.series[0].data[0].value =res.data[0]       //設定圖表資料

                             myChart2.setOption(option);     //使設定生效實現修改圖表

                         };

                     這裡用的是一個儀表盤,只有一個數據,比較簡單

網頁動態顯示數字

       由於echarts沒有類似秒錶的東西,沒有辦法單純的顯示數字,所以自己寫一個

       首先在.html檔案中新增一個用來表示數字的標籤

              <divstyle="height:30px;border:1px solid #ccc;padding:10px;width:30px">

                          <aid="ri">1234566789</a>

                      </div>

       然後在html中設定當接收到後臺資料後修改該數字

              首先在收到後臺資料後呼叫修改該數字的函式

                     $(document).ready(function(){

                             namespace = '/test';

                             var socket =io.connect(location.protocol + '//' + document.domain + ':' + location.port +namespace);

                             socket.on('server_other', function(res){

                                 update_mychart2(res);

                                 update_ri(res);

                                 });

                              });

              其中 update_ri(res);即為修改數字的函式

              然後實現該函式

                         var update_ri = function (res) { //res是json格式的response物件

                             valo = res.data[0]

                             document.getElementById("ri").innerHTML=valo

                         };

              這樣就可以看到網頁中數字動態改變的效果了