【flask框架搭建服务器demo】Python 使用轻量级 Flask 框架搭建 Web 服务器可视化数据库数据demo
创始人
2024-09-25 03:45:41
0

本文适合刚入门flask框架用来熟悉项目的开发人员,关于flask框架的组成概念一些用法请参考下面的文章

https://blog.csdn.net/qq_47452807/article/details/122289200

本文主要给出一个可视化sqlite数据库数据的demo,先展示一下效果:

主要的代码如下

(1)app.py文件

from flask import Flask, jsonify, render_template import sqlite3  # 创建一个Flask应用实例 app = Flask(__name__)  # 定义SQLite数据库的路径 DATABASE_PATH = r'E:\qt_data\sensordata.db'  # 获取数据库连接的函数 def get_db_connection():     # 连接到SQLite数据库     conn = sqlite3.connect(DATABASE_PATH)     # 将数据库查询结果设置为字典格式,便于通过列名访问数据     conn.row_factory = sqlite3.Row     return conn  # 定义根路由(主页)的处理函数 @app.route('/') def index():     # 渲染index.html模板     return render_template('index.html')  # 定义/data路由的处理函数,返回JSON格式的传感器数据 @app.route('/data') def data():     # 获取数据库连接     conn = get_db_connection()     # 创建游标对象,用于执行SQL查询     cursor = conn.cursor()     # 执行SQL查询,获取最新的20条环境数据记录,按时间戳降序排列     cursor.execute("SELECT * FROM env_data ORDER BY timestamp DESC LIMIT 20")     # 获取查询结果的所有行     rows = cursor.fetchall()     # 关闭数据库连接     conn.close()      # 构建一个字典,将查询结果中的每列数据提取到对应的列表中     data = {         "timestamp": [row["timestamp"] for row in rows],  # 时间戳         "co2": [row["co2"] for row in rows],              # 二氧化碳浓度         "ch2o": [row["ch2o"] for row in rows],            # 甲醛浓度         "tvoc": [row["tvoc"] for row in rows],            # 总挥发性有机化合物浓度         "pm2_5": [row["pm2_5"] for row in rows],          # PM2.5浓度         "pm10": [row["pm10"] for row in rows],            # PM10浓度         "temp": [row["temp"] for row in rows],            # 温度         "hum": [row["hum"] for row in rows],              # 湿度     }      # 将数据字典转换为JSON格式并返回     return jsonify(data)  # 主函数,启动Flask应用 if __name__ == '__main__':     app.run(debug=True)  # debug模式运行应用,方便开发调试 

(2)index.html文件

                 Environmental Data Visualization            

(3)script.js文件

// 异步函数fetchData,用于从服务器获取传感器数据 async function fetchData() {     // 发送HTTP GET请求到服务器的'/data'路由,并等待响应     const response = await fetch('/data');     // 将响应转换为JSON格式的数据     const data = await response.json();      // 返回获取到的数据     return data; }  // 函数createChart,用于根据传感器数据创建并初始化折线图 function createChart(data) {     // 获取页面中ID为'lineChart'的canvas元素,并获取其2D绘图上下文     const ctx = document.getElementById('lineChart').getContext('2d');     // 使用Chart.js库创建一个折线图     const chart = new Chart(ctx, {         type: 'line',  // 图表类型为折线图         data: {             // 设置X轴的标签为时间戳(数据需要反转以使最新数据在最右侧)             labels: data.timestamp.reverse(),             // 定义多条数据集,每个数据集代表一种传感器数据             datasets: [                 {                     label: 'CO2',  // 数据集标签为'CO2'                     data: data.co2.reverse(),  // 数据为CO2的浓度值(反转顺序)                     borderColor: 'rgb(255, 99, 132)',  // 设置线条颜色为红色                     fill: false  // 不填充曲线下方区域                 },                 {                     label: 'CH2O',  // 数据集标签为'CH2O'                     data: data.ch2o.reverse(),  // 数据为CH2O的浓度值(反转顺序)                     borderColor: 'rgb(54, 162, 235)',  // 设置线条颜色为蓝色                     fill: false  // 不填充曲线下方区域                 },                 {                     label: 'TVOC',  // 数据集标签为'TVOC'                     data: data.tvoc.reverse(),  // 数据为TVOC的浓度值(反转顺序)                     borderColor: 'rgb(75, 192, 192)',  // 设置线条颜色为青色                     fill: false  // 不填充曲线下方区域                 },                 {                     label: 'PM2.5',  // 数据集标签为'PM2.5'                     data: data.pm2_5.reverse(),  // 数据为PM2.5的浓度值(反转顺序)                     borderColor: 'rgb(153, 102, 255)',  // 设置线条颜色为紫色                     fill: false  // 不填充曲线下方区域                 },                 {                     label: 'PM10',  // 数据集标签为'PM10'                     data: data.pm10.reverse(),  // 数据为PM10的浓度值(反转顺序)                     borderColor: 'rgb(255, 159, 64)',  // 设置线条颜色为橙色                     fill: false  // 不填充曲线下方区域                 },                 {                     label: 'Temperature',  // 数据集标签为'温度'                     data: data.temp.reverse(),  // 数据为温度值(反转顺序)                     borderColor: 'rgb(255, 205, 86)',  // 设置线条颜色为黄色                     fill: false  // 不填充曲线下方区域                 },                 {                     label: 'Humidity',  // 数据集标签为'湿度'                     data: data.hum.reverse(),  // 数据为湿度值(反转顺序)                     borderColor: 'rgb(201, 203, 207)',  // 设置线条颜色为灰色                     fill: false  // 不填充曲线下方区域                 }             ]         },         options: {             // 使图表自适应容器大小             responsive: true,             scales: {                 x: {                     display: true,  // 显示X轴                     title: {                         display: true,  // 显示X轴的标题                         text: 'Timestamp'  // 设置X轴标题为'时间戳'                     }                 },                 y: {                     display: true,  // 显示Y轴                     title: {                         display: true,  // 显示Y轴的标题                         text: 'Value'  // 设置Y轴标题为'数值'                     }                 }             }         }     });      // 返回创建的图表对象     return chart; }  // 异步函数updateChart,用于更新图表数据 async function updateChart(chart) {     // 获取最新的数据     const data = await fetchData();      // 更新图表的X轴标签(时间戳),并反转顺序     chart.data.labels = data.timestamp.reverse();     // 更新各个数据集的数据,并反转顺序     chart.data.datasets[0].data = data.co2.reverse();     chart.data.datasets[1].data = data.ch2o.reverse();     chart.data.datasets[2].data = data.tvoc.reverse();     chart.data.datasets[3].data = data.pm2_5.reverse();     chart.data.datasets[4].data = data.pm10.reverse();     chart.data.datasets[5].data = data.temp.reverse();     chart.data.datasets[6].data = data.hum.reverse();      // 更新图表显示     chart.update(); }  // 在DOM完全加载后执行的事件监听器函数 document.addEventListener('DOMContentLoaded', async function () {     // 获取初始数据     const data = await fetchData();     // 创建并渲染图表     const chart = createChart(data);      // 每隔1秒更新一次图表数据     setInterval(async function () {         await updateChart(chart);     }, 1000);  // 1000毫秒 = 1秒 }); 

sensordata.db文件放在本文顶部了有需要自取哦

相关内容

热门资讯

lineageos86安卓系统... 亲爱的读者们,你是否厌倦了那些千篇一律的安卓系统?想要尝试一些新鲜玩意儿吗?今天,就让我带你走进一个...
安卓系统代码贡献排行,揭秘开源... 你知道吗?在科技的世界里,安卓系统可是个超级明星呢!它不仅拥有庞大的用户群体,而且还有一群超级英雄—...
安卓系统版本更新了吗,安卓系统... 你有没有发现,你的安卓手机最近是不是有点儿不一样了?是不是觉得界面更流畅,功能更强大了?没错,这就是...
原生安卓系统手机优点,原生安卓... 亲爱的手机控们,你是否曾为选择一款手机而烦恼?市面上琳琅满目的手机让人眼花缭乱,但你知道吗?原生安卓...
ios系统和安卓系统游戏互通,... 你有没有想过,为什么你的iPhone上的游戏可以和朋友的安卓手机上的游戏一起玩呢?这背后可是有着一番...
洪流系统app安卓版本,探索全... 你有没有听说过那个超级火的洪流系统app安卓版本?最近,这款应用在朋友圈里可是掀起了一股热潮呢!它不...
安卓手机系统预设色,个性与和谐... 你有没有发现,每次打开安卓手机,那屏幕上的颜色总是那么吸引眼球?没错,就是安卓手机系统预设的配色!今...
安卓新系统悬浮球,悬浮球功能全... 你知道吗?最近安卓新系统里有个超级酷的功能——悬浮球!是不是听起来就让人心动?那就让我来带你一探究竟...
安卓最强微信系统,深度解析功能... 你知道吗?在手机世界里,微信可是当之无愧的社交巨头。而在这庞大的微信家族中,安卓系统用户们最期待的莫...
校园安卓系统推广方案,打造智能... 你知道吗?最近校园里掀起了一股新的风潮,那就是安卓系统的推广。没错,就是那个我们平时手机上用的安卓系...
安卓系统剪辑视频慢,揭秘原因及... 你是不是也遇到了这个问题?手机里存了那么多精彩瞬间,想剪辑成视频分享到朋友圈,结果安卓系统的剪辑速度...
安卓系统分几个模块,内核、框架... 你有没有想过,那个陪伴你每天刷手机、玩游戏、办公的安卓系统,它里面到底藏着多少秘密呢?今天,就让我带...
安卓系统装iOS字体,字体转换... 你是不是也和我一样,对安卓手机上的iOS字体情有独钟呢?那种优雅的线条,流畅的曲线,简直让人爱不释手...
苹果安卓系统咋通用,苹果iOS... 你有没有想过,为什么苹果的iOS系统和安卓系统可以那么通用呢?是不是觉得这两个系统就像两个截然不同的...
魅族提示安卓系统,安卓系统带来... 你有没有发现,最近你的手机是不是有点儿不一样了?是不是觉得操作起来更加流畅,界面也更加美观了呢?哈哈...
如果不能用安卓系统,探索无安卓... 你有没有想过,如果有一天,你的手机不能用安卓系统,会是怎样的场景呢?想象你的手机屏幕突然变成了一个陌...
安卓怎么搜定位系统,Andro... 你是不是也有过这样的经历:手机里装了各种APP,有时候想找个人或者某个地方,却不知道怎么快速定位呢?...
核酸采集需要安卓系统,便捷高效... 最近有个事儿让咱们这些手机控们炸开了锅,那就是——核酸采集竟然需要安卓系统!是不是觉得有点不可思议?...
光遇安卓系统问题,解析与应对策... 最近在玩《光遇》的小伙伴们是不是遇到了一些小麻烦?别急,今天就来和你聊聊这款游戏在安卓系统上的一些常...
安卓系统平板看乐谱,随身携带的... 你有没有想过,在安卓系统平板上也能轻松看乐谱呢?这可不是什么天方夜谭,现在科技的发展真是让人惊喜连连...