基于Flask框架搭建简易可视化网页

前言

Flask 是一个用 Python 编写的轻量级 Web 应用框架。它是由 Armin Ronacher 开发的,并于 2010 年首次发布。Flask 以其简单性和灵活性而著称,非常适合开发小型到中型的 Web 应用程序。

环境准备

  1. Flask下载

在Python环境中使用 pip 安装 Flask:

pip install flask

Anaconda Shell
Anaconda Prompt Shell

模板结构

在 Flask 中,模板是用来生成动态 HTML 页面的一种方式。模板文件通常放在项目的 templates 文件夹内,这是 Flask 默认查找模板的地方,templates 文件夹不能改为其他名字,这将引起项目无法运行。
templates 文件夹在整个flask项目中的位置如下:

/项目文件夹
    app.py
    /templates
        base.html
        index.html
    /static
        /css
        /js
        /image

本次案例:
文件结构
本次案例中,index.html 和 base.html 都位于 templates 文件夹内,它们都被称为“模板”。

一、编写 app.py

  1. flask 模块中导入必要的库
from flask import Flask, request, render_template, redirect
app = Flask(__name__) # 创建名为 app 的Flask应用实例
模块说明
Flask用于创建应用实例
request获取请求数据
render_template渲染HTML模板
redirect重定向路由
  1. 定义主页路由 /
@app.route('/') 
def index():
    return render_template('index.html')
  • 定义了主页路由 / ,当用户访问根URL时,会触发 index() 函数。
  • index 函数使用 render_template 方法来渲染名为 index.html 的HTML页面。
  1. 定义登录页路由 login
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        # 进行登录逻辑处理
        if username == 'admin1' and password == '123':
            return redirect('/charts1')
        elif username == 'admin2' and password == '123':
            return redirect('/charts2')
        else:
            return '账号或密码错误!'
    else: # 否则即当前接收GET请求时,正常返回网页
        return render_template('login.html')
  • 定义/login路由,它可以接受GET和POST两种HTTP请求方法。
  • 如果是POST请求(提交表单),它将从表单数据中获取用户名request.form['username']和密码request.form['password'] ,并进行简单的账号密码判定。如果匹配,则重定向到相应的图表页面(/charts1、/charts2);如果不匹配,则返回一个错误信息。
  • 如果是GET请求,则表示用户正在请求登录页面,因此它将渲染并返回login.html模板。
  1. 定义图表路由 charts1、charts2
@app.route('/charts1')
def charts1():
    return render_template('charts1.html')
@app.route('/charts2')
def charts2():
    return render_template('charts2.html')
  • charts1、charts2分别对应 admin1admin2账户
  • 每个个函数都使用render_template方法来渲染各自的HTML页面。
    • render_template(‘charts1.html’)
    • render_template(‘charts2.html’)
  1. 启动 flask 内置服务器
if __name__ == '__main__':
    app.run('0.0.0.0', debug=True)
  • 当脚本直接运行时(而不是被作为模块导入),此时会启动Flask的内置服务器,使应用可以在所有网络接口上监听连接请求(通过指定’0.0.0.0’)。
  • debug=True参数启用了调试模式,这样在开发过程中,任何代码修改都会自动重新加载服务器,并且在遇到错误时提供有用的调试信息。

app.py代码

from flask import Flask, request, render_template, redirect
app = Flask(__name__)

# 定义主页
@app.route('/')
def index():
    return render_template('index.html')

# 定义一个处理登录请求的路由
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        # 进行登录逻辑处理
        if username == 'admin1' and password == '123':
            return redirect('/charts1')
        elif username == 'admin2' and password == '123':
            return redirect('/charts2')
        else:
            return '账号或密码错误!'
    else: # 否则即当前接收GET请求时,正常返回网页
        return render_template('login.html')

# 定义图形界面的路由
@app.route('/charts1')
def charts1():
    return render_template('charts1.html')
@app.route('/charts2')
def charts2():
    return render_template('charts2.html')

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

运行调式结果
配置路由部分

二、HTML部分

1. login.html

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登录页面</title>
    <!-- 引入Bootstrap CSS -->
    <link href="../static/css/bootstrap.css" rel="stylesheet">
    <style>
        .login-container {
            width: 100%;
            max-width: 400px;
            padding: 2rem;
            border: 1px solid #dee2e6;
            border-radius: 0.5rem;
            box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
        }
    </style>
</head>

<body>
    <div class="d-flex flex-column justify-content-center align-items-center min-vh-100">
        <div class="login-container">
            <h3 class="text-center mb-4">数据大屏登录</h3>
            <form action="/login" method="POST">
                <div class="mb-3">
                    <label for="username" class="form-label">用户名</label>
                    <input type="text" class="form-control" id="username" name="username" placeholder="请输入用户名" required>
                </div>
                <div class="mb-3">
                    <label for="password" class="form-label">密码</label>
                    <input type="password" class="form-control" id="password" name="password" placeholder="请输入密码" required>
                </div>
                <button type="submit" class="btn btn-primary w-100">登录</button>
            </form>
        </div>
    </div>
</body>

</html>

2. index.html

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>简单主页</title>
    <!-- 引入Bootstrap CSS -->
    <link href="../static/css/bootstrap.css" rel="stylesheet">
</head>
<body>
    <div class="container d-flex flex-column justify-content-center align-items-center min-vh-100">
        <h1>数据可视化系统</h1>
        <a href="{{ url_for('login') }}" class="btn btn-primary">登录</a>
    </div>
</body>
</html>

: 在点击 a标签 登录时,使用了 Flask 内置的 url_for 函数,该函数会根据给定的视图函数(app.py中 login()函数)名称来跳转到对应的 URL。 url_for 只能在 Flask 的 Jinja2 模板环境中工作,Jinja2 是 Flask 默认使用的模板引擎。

3. base_mission.html —父模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src='../static/js/echarts.min.js'></script>
</head>
<body>
    <h1>这是用户【{% block h1 %}用户名{% endblock %}】的图形界面</h1>
    <div id="main" style="width: 800px; height: 400px;"></div>
    {% block content %}echarts代码{% endblock %}
</body>
</html>

4. charts1、charts2 图表 —子模板

charts1.html

{% extends 'base_mission.html' %}
{% block title %}111{% endblock %}
{% block h1 %}admin1{% endblock %}
{% block content %}
<script>
    // 选择DOM并创建echarts图形对象
    var chartDom = document.getElementById('main');
    var myChart = echarts.init(chartDom);
    // 配置项
    option = {
        xAxis: {
            type: 'category',
            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
        },
        yAxis: {
            type: 'value'
        },
        series: [{
            data: [120, 200, 150, 80, 70, 110, 130],
            type: 'bar',
            barWidth: '60%', // 指定柱子的宽度
            barCategoryGap: '15%', // 控制柱子之间的默认间隙
            emphasis: {
                focus: 'self' // 只聚焦(不淡出)当前高亮的数据的图形。
            }
        }]
    };
    // 配置项配置到图形中
    myChart.setOption(option);
</script>
{% endblock %}

charts2.html

{% extends 'base_mission.html' %}
{% block title %}111{% endblock %}
{% block h1 %}admin2{% endblock %}
{% block content %}
<script>
    // 选择DOM并创建echarts图形对象
    var chartDom = document.getElementById('main');
    var myChart = echarts.init(chartDom);
    // 配置项
    option = {
        xAxis: {
            type: 'category',
            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
        },
        yAxis: {
            type: 'value'
        },
        series: [{
            data: [120, 200, 150, 80, 70, 110, 130],
            type: 'line',
            smooth: true, // 线条平滑处理
            areaStyle: {} // 开启面积填充
        }]
    };
    // 配置项配置到图形中
    myChart.setOption(option);
</script>
{% endblock %}

使用flask中模板继承的方式实现两个echarts(charts1、charts2)图形的显示

5. 静态文件下载 /static

css样式下载:
* bootstrap.css
* Bootstrap中文文档

js下载:
* echarts.min.js
* 在线定制

最终效果

打开链接
在这里插入图片描述

主页
在这里插入图片描述

登录页
在这里插入图片描述
charts1、charts2
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值