from flask import Flask, render_template, redirect, url_for, request, session app = Flask(__name__) app.secret_key = 'your_secret_key' # 模拟用户数据 USER_CREDENTIALS = {'admin': '666666'} # 首页重定向到登录 @app.route('/') def home(): if 'username' not in session: return redirect(url_for('login')) return redirect(url_for('dashboard')) # 登录页面 @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] if username in USER_CREDENTIALS and USER_CREDENTIALS[username] == password: session['username'] = username return redirect(url_for('dashboard')) else: return render_template('login.html', error="用户名或密码错误") return render_template('login.html') # 登出 @app.route('/logout') def logout(): session.pop('username', None) return redirect(url_for('login')) # 图表展示页面 @app.route('/dashboard') def dashboard(): if 'username' not in session: return redirect(url_for('login')) # 图表信息 charts = [ {'name': '薪资分布(按区间)', 'file': 'salary_range_distribution.png'}, {'name': '薪资分布与公司规模的关系', 'file': 'salary_vs_company_size_boxplot.png'}, {'name': '不同公司规模的薪资分布小提琴图', 'file': 'salary_company_size_violinplot.png'}, {'name': '行业薪资均值及波动箱型图', 'file': 'industry_salary_with_variance.png'}, {'name': '企业类型职位数量占比饼图', 'file': 'company_type_pie_chart.png'}, {'name': '按行业职位数量', 'file': 'industry_counts.png'}, {'name': '按企业类型职位数量', 'file': 'company_type_counts.png'}, {'name': '按公司规模职位数量', 'file': 'company_size_counts.png'}, {'name': '热门职位关键词词云', 'file': 'job_title_wordcloud.png'}, {'name': '热门行业关键词词云', 'file': 'industry_wordcloud.png'}, {'name': '按行业统计工资平均值', 'file': 'industry_salary.png'}, {'name': '按企业类型统计工资平均值', 'file': 'company_type_salary.png'}, {'name': '按公司规模统计工资平均值', 'file': 'company_size_salary
时间: 2025-05-20 08:07:59 浏览: 31
<think>好的,我现在需要帮助用户解决如何在Flask中实现用户认证和图表展示的问题。首先,我需要回忆一下Flask的相关知识,特别是用户认证和会话管理的部分,以及如何集成图表展示。
用户认证方面,我记得Flask有扩展比如Flask-Login,可以方便地管理用户会话。不过用户可能希望一个基本的实现示例,所以可能需要用原生的Flask会话管理来处理。首先,用户注册和登录需要表单,处理表单数据,验证用户信息,然后使用session对象来存储用户ID,这样就能跟踪登录状态。同时,需要设置登录路由和注销路由。
然后是图表展示部分,用户可能希望将数据可视化,比如使用Matplotlib生成图表,或者前端库如Chart.js。不过考虑到用户提到了结合Flask和后端生成图表,可能需要将图表保存为静态文件或者在HTML中嵌入Base64编码的图片。或者,使用JavaScript库在前端动态渲染图表,这样更灵活。比如,使用Matplotlib生成图表,转换为Base64,再传给模板显示。
接下来,需要将这些部分结合起来。用户认证后的页面应该显示图表,所以需要保护路由,确保只有登录用户才能访问。在Flask中,可以通过装饰器来检查session中是否存在用户信息,如果没有则重定向到登录页面。
代码结构方面,可能需要几个路由:/register(注册)、/login(登录)、/logout(注销)、/dashboard(展示图表)。模板需要注册和登录的表单页面,以及一个仪表盘页面显示图表。静态文件可能需要存放CSS或JS,比如Chart.js。
安全问题方面,存储密码时需要哈希处理,不能明文存储。可以使用werkzeug的security模块中的generate_password_hash和check_password_hash函数。用户模型可能只是一个简单的字典或列表,因为用户可能不需要数据库,但实际应用中应该使用数据库如SQLAlchemy。
图表数据部分,可能需要模拟一些数据,或者从数据库获取。这里为了示例,可以生成随机数据,用Matplotlib创建图表,保存为图片,再传递给模板。
现在,需要考虑用户可能的疑问,比如如何保持用户登录状态,如何处理表单的CSRF保护,以及如何将图表嵌入到页面中。虽然用户没有提到CSRF,但实际应用中应该考虑,不过示例中可以简化。图表展示部分,使用Base64编码可能比较简单,不需要保存文件,直接在HTML中显示。
最后,确保代码示例正确,没有语法错误,并按照用户的要求使用Flask和会话管理。同时,页面设计部分可能需要结合HTML和CSS,但用户主要关注功能实现,所以示例可以简化前端部分,重点放在后端逻辑。
总结步骤:
1. 设置Flask应用和必要的配置(密钥)。
2. 创建用户存储(临时使用字典)。
3. 实现注册和登录路由,处理表单数据,哈希密码,管理会话。
4. 实现受保护的路由(如/dashboard),检查会话。
5. 在受保护的路由中生成图表数据,使用Matplotlib生成图表,转换为Base64。
6. 在模板中显示图表,并设计简单的页面布局。
7. 添加注销功能,清除会话。
8. 测试各部分功能是否正常。
现在需要将这些步骤转化为代码,并确保各部分衔接正确。同时,可能需要处理表单的GET和POST请求,以及错误提示,比如用户名已存在或登录失败的情况。
可能遇到的问题:用户未登录时访问仪表盘应该重定向,图表生成和Base64转换的正确性,以及会话管理的安全性。虽然示例中使用了简单的字典存储用户,但需要提醒用户在实际应用中使用数据库。
最后,根据用户提供的引用,特别是引用[4]关于Flask的简易数据可视化,可能需要引用相关部分,但用户提供的引用似乎更多关于前端和Django,所以可能引用[4]提到Flask适用于各种项目,包括数据可视化,可以引用这一点来支持示例的可行性。</think>以下是一个基于Flask实现用户认证与图表展示的完整示例,包含会话管理、登录验证和ECharts可视化集成:
### 一、基础环境搭建
```python
# app.py
from flask import Flask, render_template, request, redirect, session, url_for
from werkzeug.security import generate_password_hash, check_password_hash
import matplotlib.pyplot as plt
import base64
from io import BytesIO
app = Flask(__name__)
app.secret_key = 'your_secure_secret_key_here' # 生产环境需使用随机密钥
# 临时用户存储(生产环境应使用数据库)
users = {
"admin": generate_password_hash("admin123")
}
```
### 二、用户认证模块实现
```python
# 登录路由
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if username in users and check_password_hash(users[username], password):
session['user'] = username
return redirect(url_for('dashboard'))
return "无效的凭证"
return render_template('login.html')
# 注册路由
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form['username']
password = generate_password_hash(request.form['password'])
if username not in users:
users[username] = password
return redirect(url_for('login'))
return "用户已存在"
return render_template('register.html')
# 注销路由
@app.route('/logout')
def logout():
session.pop('user', None)
return redirect(url_for('login'))
```
### 三、受保护仪表盘与可视化
```python
def generate_chart():
# 生成示例数据
labels = ['1月', '2月', '3月', '4月', '5月']
values = [10, 20, 15, 35, 25]
# 创建图表
plt.figure()
plt.plot(labels, values, marker='o')
plt.title("月度销售趋势")
# 转换为Base64
buffer = BytesIO()
plt.savefig(buffer, format='png')
buffer.seek(0)
return base64.b64encode(buffer.getvalue()).decode()
# 仪表盘路由
@app.route('/dashboard')
def dashboard():
if 'user' not in session:
return redirect(url_for('login'))
chart_data = generate_chart()
return render_template('dashboard.html',
username=session['user'],
chart_image=chart_data)
```
### 四、模板文件示例
```html
<!-- templates/dashboard.html -->
<!DOCTYPE html>
<html>
<head>
<title>数据仪表盘</title>
</head>
<body>
<h2>欢迎, {{ username }}!</h2>
<a href="{{ url_for('logout') }}">注销</a>
<div class="chart-container">
<img src="data:image/png;base64,{{ chart_image }}"
alt="月度销售图表">
</div>
</body>
</html>
```
### 五、运行与测试
```bash
export FLASK_APP=app.py
flask run
```
阅读全文
相关推荐



















