【flask框架搭建服务器demo】Python 使用轻量级 Flask 框架搭建 Web 服务器可视化数据库数据demo

news2024/9/22 3:37:39

本文适合刚入门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文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Environmental Data Visualization</title>
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
    <div style="width: 80%; margin: auto;">
        <canvas id="lineChart"></canvas>
    </div>

    <script src="{{ url_for('static', filename='js/script.js') }}"></script>
</body>
</html>

(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文件放在本文顶部了有需要自取哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2075057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端速通面经八股系列(二)—— HTML篇

HTML高频面经八股目录 1. src和href的区别2. 对HTML语义化的理解3. DOCTYPE(⽂档类型) 的作⽤4. script标签中defer和async的区别5. 常⽤的meta标签有哪些6. HTML5有哪些更新1. 语义化标签2. 媒体标签3. 表单4. 进度条、度量器5.DOM查询操作6. Web存储7. 其他 7. img的srcset属…

Python 图像处理进阶:特征提取与图像分类

特征提取 特征提取是计算机视觉中的一个重要环节&#xff0c;它可以从图像中提取出有助于后续处理的特征&#xff0c;比如用于识别和分类的关键点、纹理等。常见的特征提取方法包括SIFT、SURF和ORB等。 SIFT&#xff08;尺度不变特征变换&#xff09; SIFT是一种用于检测图像…

Web-ssrfme--redis 未授权访问攻击

目录 1、题目源码 2、测试ssrf 3、发现主机 4、发现服务 5、redis 未授权访问攻击 6&#xff0c;拿flag 1、题目源码 <?php highlight_file(__file__); function curl($url){ $ch curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER…

用Maven开发Spring Boot 项目

一、初识 Spring Boot Spring Boot框架是一 套开源的后台开发框架&#xff0c; 继承了Spring MVC框架的前辈SSM框架的优秀特性&#xff0c;通过注解大幅减少程序员写配置的工作量。从企业开发角度来看&#xff0c;它提供了自动化配置&#xff0c;内嵌容器和兼容Maven等核心功…

银河麒麟桌面操作系统V10:如何快速将应用固定到任务栏?

银河麒麟桌面操作系统V10&#xff1a;如何快速将应用固定到任务栏&#xff1f; 1、图形界面方法2、命令行方法2.1 固定应用2.2 取消固定 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在银河麒麟V10中&#xff0c;/usr/share/applications…

Vue 绘制圆形 上下左右

效果图 代码&#xff1a; <div style"transform: rotate(45deg)"><div id"top"><div id"top-left" click"addformData(true, form.lat, 0.000003, lat)"><ArrowUpBold style"height: 25px; width: 25px; tr…

winform 实现优美的进度条 包含百分比

winform 原生控件中包含进度条控件 ProgressBar。 但这个控件并没有告诉我们如何在上面实现 显示百分比进度的方式&#xff0c;或者说根本就不支持。但没 有百分比显示的进度条是没有灵魂的&#xff0c;可能是有点让人一头雾水的。 还好我们可以通过实现 ProgressBar 的 OnP…

海康VisionMaster使用学习笔记18-常见问题排查

常见问题排查思路 常见问题排查方法-安装阶段 常见问题排查方法-启动阶段 常见问题排查方法-使用阶段 常见问题排查方法-相关资料

outlook在“对我发送的邮件应用规则”时只能移动邮件副本的问题和解决方案

outlook在“对我发送的邮件应用规则时”只能移动邮件副本的问题 问题描述问题的解决方案第一步第二步 其他说明参考 问题描述 如果我们想对自己发送的邮件进行分类&#xff0c;可以使用规则将已发送的邮件移动到指定文件夹中&#xff0c;但是。当操作对象为“自己发送的邮件时…

运维学习————LVS集群和Keepalived+LVS高可用

目录 官网&#xff1a;LVS中文官网 一、概念 二、组成及软件工作层次图 ​编辑 三、整体架构 四、名词解释 五、三种工作模式 1、LVS-NAT 2、LVS-TUN 3、LVS-DR 六、DR模式的实现 1、克隆出LVS&#xff0c;配置虚拟IP 2、配置Nginx的虚拟IP Nginx1的配置 Nginx2…

Linux的一些实例

# 1.编写脚本&#xff0c;让用户输入firstname和lastname&#xff0c;最后在屏幕上显示your full name is&#xff1a; #!/bin/bash read -p "please input firstname:" var1 read -p "please input lastname:" var2 echo "your full name is:$var1…

【机器学习】线性回归的概念以及如何从最小二乘法推导到正规方程和实际线性回归实例(含python代码)

引言 线性回归是一种广泛应用于统计分析、经济预测、机器学习等领域的建模方法。它旨在通过自变量&#xff08;解释变量&#xff09;来预测因变量&#xff08;响应变量&#xff09;的值 文章目录 引言一、线性回归的概念1.1 线性回归的基本概念1.2 最小二乘法1.2.1 最小二乘法的…

来了!!!来了!!!--我需要在Docker中运行Java应用程序,但是没有Docker经验,你能给我一个简单的入门指南吗?

在Docker中运行Java应用程序的简单入门指南&#xff1a; 1.安装Docker 首先&#xff0c;确保你的系统上安装了Docker。你可以从Docker官网下载并安装适合你操作系统的Docker版本。 Windows10 安装 Docker&#xff0c;每个步骤作者亲测&#xff0c;细节记录最全教程 2. 编写D…

Sublime Text 配置 Terminal (CMD)

1. 安装package 按住 【ctrlshiftp】 , 在弹出的输入框中输入“install”&#xff0c;选择“install package”,回车,等待20秒左右 2. 安装terminal 按住 【ctrlshiftp】 , 在弹出的输入框中输入“install”&#xff0c;选择“install package”,回车,等待新弹窗出来&#…

稀土长余辉发光剂在陶瓷中的应用

稀土长余辉发光剂是一种特殊的发光材料&#xff0c;主要由稀土元素&#xff08;如镧、铈、钕、铽、镝等&#xff09;掺杂而成&#xff0c;基于电子陷阱机理&#xff0c;可实现长余辉效果&#xff0c;发光时间长达6-8小时。 稀土长余辉发光材料在陶瓷上的应用主要利用了其在激…

不相交的线(Lc1035)——动态规划

在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足&#xff1a; nums1[i] nums2[j]且绘制的直线不与任何其他连线&#xff08;非水平线&#xff09;相…

论文翻译:ChatGPT passing USMLE shines a spotlight on the flaws of medical education

ChatGPT passing USMLE shines a spotlight on the flaws of medical education https://journals.plos.org/digitalhealth/article?id10.1371/journal.pdig.0000205 ChatGPT 通过美国执业医师执照考试&#xff08;USMLE&#xff09;凸显了医学教育的缺陷 阿马拉奇B姆巴克韦1…

你不知道的100个国外搜索引擎升级版

首先是要支持国产品牌磁力狐&#xff0d;cilih.com DMOZ – 一个多语种、开放式网站目录。 Food Blog Search -可以让你从上千个博客和网站查找菜谱。 Swoogle – 一个语义、文件、术语和数据的搜索引擎&#xff0c;不同于普通的搜索引擎。 SimilarSiteSearch – 帮你找到相似…

排序------快速排序(C语言实现)

目录 快速排序算法 例题 题目描述 具体代码&#xff1a; 代码分析 函数定义&#xff1a; 主函数&#xff1a; 快速排序算法 快速排序&#xff08;QuickSort&#xff09;是一种高效的排序算法&#xff0c;它采用分治策略&#xff0c;通过选择一个“基准”元素并将其他元素…

计算机网络面试真题总结(五)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 说一说HTTP1.0&#xff0c;1.1&#xff0c;2.0 的区别 HTTP/1.0 H…