简易可视化网页
前言
Flask 是一个用 Python 编写的轻量级 Web 应用框架。它是由 Armin Ronacher 开发的,并于 2010 年首次发布。Flask 以其简单性和灵活性而著称,非常适合开发小型到中型的 Web 应用程序。
环境准备
- Flask下载
在Python环境中使用 pip 安装 Flask:
pip install flask
Anaconda 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
- 从
flask
模块中导入必要的库
from flask import Flask, request, render_template, redirect
app = Flask(__name__) # 创建名为 app 的Flask应用实例
模块 | 说明 |
---|---|
Flask | 用于创建应用实例 |
request | 获取请求数据 |
render_template | 渲染HTML模板 |
redirect | 重定向路由 |
- 定义主页路由 /
@app.route('/')
def index():
return render_template('index.html')
- 定义了主页路由
/
,当用户访问根URL时,会触发index()
函数。 - index 函数使用
render_template
方法来渲染名为index.html
的HTML页面。
- 定义登录页路由 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
模板。
- 定义图表路由 charts1、charts2
@app.route('/charts1')
def charts1():
return render_template('charts1.html')
@app.route('/charts2')
def charts2():
return render_template('charts2.html')
- charts1、charts2分别对应
admin1
和admin2
账户 - 每个个函数都使用render_template方法来渲染各自的HTML页面。
- render_template(‘charts1.html’)
- render_template(‘charts2.html’)
- 启动 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