软件开发定制Flask框架:如何运用Ajax轮询动态绘图

摘要:是异步JavaScript和XML软件开发定制可用于前后端交互。

软件开发定制本文分享自华为云社区《》,作者:LyShark。

Ajax是异步JavaScript软件开发定制和可用于前后端交互,在之前《Flask 框架:运用Ajax软件开发定制实现数据交互》软件开发定制简单实现了,软件开发定制本章将通过Ajax软件开发定制获取后端的数据,前台使用echart绘图库进行图形的生成与展示,后台通过render_template方法返回一串JSON数据集,前台收到后将其应用到绘图库上,实现动态监控内存利用率的这个功能。

首先LyShark先来演示一下前端如何运用AJAX实现交互,通过$.ajax定义ajax开始标志,并指定url,type,datetype等信息,通过setInterval设置一个1000毫秒的定时器,每隔一段时间则去后端取数据。

  1. <!--
  2. # 署名权
  3. # right to sign one's name on a piece of work
  4. # PowerBy: LyShark
  5. # Email: me@lyshark.com
  6. -->
  7. <!DOCTYPE html>
  8. <html lang="en">
  9. <head>
  10. <meta charset="UTF-8">
  11. <script type="text/javascript" src="https://cdn.lyshark.com/javascript/jquery/3.5.1/jquery.min.js"></script>
  12. <script type="text/javascript" src="https://cdn.lyshark.com/javascript/echarts/5.3.0/echarts.min.js"></script>
  13. </head>
  14. <body>
  15. <!--设定一个定时器,每隔1000毫秒向后端发送请求-->
  16. <script type="text/javascript">
  17. $(
  18. function () {
  19. fetchData();
  20. setInterval(fetchData, 1000);
  21. }
  22. );
  23. function fetchData(){
  24. $.ajax({
  25. url:"/",
  26. type:"POST",
  27. dataType: 'json',
  28. success:function (recv) {
  29. console.log("[lyshark.com] 获取到时间:" + recv.response[0]);
  30. console.log("[lyshark.com] 获取到数据:" + recv.response[1]);
  31. }
  32. })
  33. }
  34. </script>
  35. </body>

后端只需要根据前端需要的格式返回系统中的CPU利用率(此处模拟),并使用json.dumps({"response":[times,data]})推送到前端即可。

  1. # 署名权
  2. # right to sign one's name on a piece of work
  3. # PowerBy: LyShark
  4. # Email: me@lyshark.com
  5. from flask import Flask,render_template,request
  6. import json,time,random
  7. async_mode = None
  8. app = Flask(import_name=__name__,
  9. static_url_path='/python', # 配置静态文件的访问url前缀
  10. static_folder='static', # 配置静态文件的文件夹
  11. template_folder='templates') # 配置模板文件的文件夹
  12. @app.route('/',methods=['POST','GET'])
  13. def index():
  14. if request.method == "GET":
  15. return render_template("index.html")
  16. elif request.method == "POST":
  17. times = time.strftime("%M:%S", time.localtime())
  18. data = [random.randint(1,100)]
  19. return json.dumps({"response":[times,data]})
  20. if __name__ == '__main__':
  21. app.run()

运行这段代码,然后打开控制台,则可以看到如下数据,前台会每隔一秒向后端请求数据;

如果上方绘制可以被正确执行,那么想要实现轮询绘图只需要封装实现一个update()自定义绘图函数,该函数内将得到的数据统一放入到数组内,并调用封装好的display()函数,将数据绘制到前台。

  1. <!--
  2. # 署名权
  3. # right to sign one's name on a piece of work
  4. # PowerBy: LyShark
  5. # Email: me@lyshark.com
  6. -->
  7. <!DOCTYPE html>
  8. <html lang="en">
  9. <head>
  10. <meta charset="UTF-8">
  11. <script type="text/javascript" src="https://cdn.lyshark.com/javascript/jquery/3.5.1/jquery.min.js"></script>
  12. <script type="text/javascript" src="https://cdn.lyshark.com/javascript/echarts/5.3.0/echarts.min.js"></script>
  13. </head>
  14. <body>
  15. <!--定义绘图区域-->
  16. <div id="main" style="height:300px;width:80%;border:1px solid #eecc11;padding:10px;"></div>
  17. <!--调用百度的绘图库,进行图片的绘制工作.-->
  18. <script type="text/javascript" charset="UTF-8">
  19. var display = function(time,cpu) {
  20. var main = echarts.init(document.getElementById(("main")));
  21. var option = {
  22. xAxis: {
  23. boundaryGap:false,
  24. boundaryGap:false,
  25. type: 'category',
  26. data: time
  27. },
  28. yAxis: {
  29. type: 'value'
  30. },
  31. series: [{
  32. type: 'line',
  33. areaStyle:{},
  34. data: cpu
  35. }]
  36. };
  37. main.setOption(option,true);
  38. };
  39. </script>
  40. <!--update()函数具体执行的任务,其主要只保留前十条数据.-->
  41. <script type="text/javascript" charset="UTF-8">
  42. // 负责对参数的解析
  43. var time =["","","","","","","","","",""];
  44. var cpu = [0,0,0,0,0,0,0,0,0,0];
  45. var update = function(recv){
  46. time.push(recv.response[0]);
  47. cpu.push(parseFloat(recv.response[1]));
  48. if(time.length >=10){
  49. time.shift();
  50. cpu.shift();
  51. console.log("处理后的时间数据:" + time);
  52. console.log("处理后的CPU数据:" + cpu);
  53. display(time,cpu) // 调用绘图函数
  54. }
  55. };
  56. </script>
  57. <!--设定一个定时器,每隔1000毫秒向后端发送请求-->
  58. <script type="text/javascript">
  59. $(
  60. function () {
  61. fetchData();
  62. setInterval(fetchData, 1000);
  63. }
  64. );
  65. function fetchData(){
  66. $.ajax({
  67. url:"/",
  68. type:"POST",
  69. dataType: 'json',
  70. success:function (recv) {
  71. console.log("获取到时间:" + recv.response[0]);
  72. console.log("获取到数据:" + recv.response[1]);
  73. // 传递给处理函数
  74. update(recv)
  75. }
  76. })
  77. }
  78. </script>
  79. </body>

对于后台来说,我们不需要做任何变更,因为只要我们遵循返回JSON的格式即可,运行替换后的程序,我们可以看到控制台会出现以下参数;

这就标志着接收的数据是正确的,我们来看下最终绘制效果;

当然有时候我们需要返回多个图形,而不是一个,运用轮询同样可以实现,如下案例中将两个仪表盘合并在了一起,并通过一个接口实现了数据的轮询,相比上方代码变化并不大。

  1. <!--
  2. # 署名权
  3. # right to sign one's name on a piece of work
  4. # PowerBy: LyShark
  5. # Email: me@lyshark.com
  6. -->
  7. <!DOCTYPE html>
  8. <html lang="en">
  9. <head>
  10. <meta charset="UTF-8">
  11. <script type="text/javascript" src="https://cdn.lyshark.com/javascript/jquery/3.5.1/jquery.min.js"></script>
  12. <script type="text/javascript" src="https://cdn.lyshark.com/javascript/echarts/5.3.0/echarts.min.js"></script>
  13. </head>
  14. <body>
  15. <!--定义绘图区域-->
  16. <div id="cpuChart" style="width: 20%; height: 300px; border: 1px solid #dddddd; float:left; margin-right: 8px;"></div>
  17. <div id="memChart" style="width: 20%; height: 300px; border: 1px solid #dddddd; float:left; margin-right: 8px;"></div>
  18. <!--封装方法,一次性绘制两个图形-->
  19. <script type="text/javascript" charset="UTF-8">
  20. var display = function(cpu,mem)
  21. {
  22. var cpuChart = echarts.init(document.getElementById("cpuChart"));
  23. var option = {
  24. series: [
  25. {
  26. name: 'Pressure',
  27. type: 'gauge',
  28. progress: {
  29. show: true
  30. },
  31. detail: {formatter: '{value} %',fontSize: 12},
  32. data: [{value: cpu, name: 'CPU负载'}]
  33. }
  34. ]
  35. };cpuChart.setOption(option, true);
  36. var memChart = echarts.init(document.getElementById("memChart"));
  37. var option = {
  38. series: [
  39. {
  40. name: 'Pressure',
  41. type: 'gauge',
  42. progress: {
  43. show: true
  44. },
  45. detail: {formatter: '{value} %',fontSize: 12},
  46. data: [{value: mem, name: '内存利用率'}]
  47. }
  48. ]
  49. };memChart.setOption(option, true);
  50. };
  51. </script>
  52. <!--定义轮巡-->
  53. <script type="text/javascript">
  54. $(
  55. function () {
  56. fetchData();
  57. setInterval(fetchData, 100);
  58. }
  59. );
  60. function fetchData(){
  61. $.ajax({
  62. url:"/",
  63. type:"POST",
  64. dataType: 'json',
  65. success:function (recv) {
  66. display(recv.response[0],recv.response[1]);
  67. }
  68. })
  69. }
  70. </script>
  71. </body>

后端部分只需要稍微小改一下,将json.dumps({"response":[cpu,mem]})返回时指定两个参数即可。

  1. # 署名权
  2. # right to sign one's name on a piece of work
  3. # PowerBy: LyShark
  4. # Email: me@lyshark.com
  5. from flask import Flask,render_template,request
  6. import json,time,random
  7. async_mode = None
  8. app = Flask(import_name=__name__,
  9. static_url_path='/python', # 配置静态文件的访问url前缀
  10. static_folder='static', # 配置静态文件的文件夹
  11. template_folder='templates') # 配置模板文件的文件夹
  12. @app.route('/',methods=['POST','GET'])
  13. def index():
  14. if request.method == "GET":
  15. return render_template("index.html")
  16. elif request.method == "POST":
  17. times = time.strftime("%M:%S", time.localtime())
  18. mem = random.randint(1,100)
  19. cpu = random.randint(1,100)
  20. return json.dumps({"response":[cpu,mem]})
  21. if __name__ == '__main__':
  22. app.run()

运行后,在前端可以看到两个仪表盘分别显示不同的参数;

 

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发