flask+sqlalchemy+echarts动态显示数据

一、创建测试数据

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` bigint(20) NOT NULL COMMENT '主键ID',
  `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
  `age` int(11) NULL DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'Jone', 18, 'test1@baomidou.com');
INSERT INTO `user` VALUES (2, 'Jack', 20, 'test2@baomidou.com');
INSERT INTO `user` VALUES (3, 'Tom', 28, 'test3@baomidou.com');
INSERT INTO `user` VALUES (4, 'Sandy', 21, 'test4@baomidou.com');
INSERT INTO `user` VALUES (5, 'Billie', 24, 'test5@baomidou.com');

SET FOREIGN_KEY_CHECKS = 1;

二、flask项目中创建数据实体类和数据库连接类

1、在beans包中创建User.py文件用于数据封装

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, INT, VARCHAR, BIGINT

Base = declarative_base()


class User(Base):
    __tablename__ = 'user'
    id = Column(BIGINT, primary_key=True)
    name = Column(VARCHAR)
    age = Column(INT)
    email = Column(BIGINT)

    def __repr__(self):
        return '{} {} {}'.format(self.name, self.age, self.email)

2、在utils包中创建operation.py文件用于数据库操作

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker


class MysqlOperation:
    username = 'root'
    password = '12345'
    url = 'localhost'
    port = '3306'
    db = 'study'
    __session = None

    @classmethod
    def get_session(cls):
        __engine = create_engine(
            'mysql+pymysql://{}:{}@{}:{}/{}'.format(cls.username, cls.password, cls.url, cls.port, cls.db))
        Session = sessionmaker(bind=__engine)
        cls.__session = Session()
        return cls.__session

    @classmethod
    def close(cls):
        if cls.__session:
            cls.__session.close()

    @classmethod
    def commit(cls):
        if cls.__session:
            cls.__session.commit()

三、在app.py文件中定义flask访问路径

from flask import Flask, render_template, jsonify
from beans.User import User
from utils.operation import MysqlOperation

app = Flask(__name__)


@app.route("/get_users")
def get_users():
    session = MysqlOperation.get_session()
    users = session.query(User).all()
    x_data = [str(i).split(' ')[0] for i in users]
    y_data = [str(i).split(' ')[1] for i in users]
    data = {
        'x_data': x_data,
        'y_data': y_data
    }
    MysqlOperation.close()
    return jsonify(data)


@app.route("/")
def index():
    return render_template('echarts.html')


if __name__ == '__main__':
    app.run(debug=True)

四、templates目录中创建echarts.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="{{ url_for('static', filename='jquery-3.5.1.min.js') }}"></script>
    <script src="{{ url_for('static', filename='echarts.min.js') }}"></script>
</head>
<body>
<div style="width: 600px;height: 400px" id="main"></div>

<script>
    let myChart = echarts.init(document.getElementById("main"));
    let option = {
        yAxis: {},
        xAxis: [{
            type: "category",
            data: []
        }],
        legend: {},
        series: [{
            name: '折线图',
            type: 'line',
            data: []
        }]
    }
    myChart.setOption(option);
    $.get("/get_users").done(function (data) {
        myChart.setOption({
            xAxis: {
                type: "category",
                data: data.x_data
            },
            series: {
                name: '折线图',
                type: 'line',
                data: data.y_data
            }
        })
    })
</script>
</body>
</html>

五、项目结构如下

在这里插入图片描述

六、app.py文件运行结果

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值