1.掌握Flask框架的基本使用方法
2.理解Web应用的会话管理机制
3.实现用户认证系统的基本功能
4.学习模板继承和表单处理技术
要求:请将思考题的答案写在实验报告中
1.基础环境搭建:创建项目目录结构、安装必要依赖包
2.核心功能实现:用户注册(用户名、密码)、用户登录验证、会话状态管理、用户退出功能
3.前端界面开发:基础模板设计、注册/登录表单实现
4.系统测试验证:注册新用户测试、登录功能测试、会话保持测试
/flask_auth_system
├── app.py
├── templates/
├── base.html
├── index.html
├── login.html
└── register.html
from flask import Flask, render_template, request, redirect, url_for, session, flash
app = Flask(__name__)
app.secret_key = '1220911101_fyt_secret_key'
# 模拟用户数据库
users = {
'admin': 'admin123' # 预置测试用户
}
@app.route('/')
def home():
if 'username' in session:
return render_template('index.html', username=session['username'])
return redirect(url_for('login'))
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if username in users:
flash('用户名已存在')
else:
users[username] = password
flash('注册成功,请登录')
return redirect(url_for('login'))
return render_template('register.html')
@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 users[username] == password:
session['username'] = username
flash('登录成功')
return redirect(url_for('home'))
flash('用户名或密码错误')
return render_template('login.html')
@app.route('/logout')
def logout():
session.pop('username', None)
flash('您已成功退出')
return redirect(url_for('home'))
if __name__ == '__main__':
app.run(debug=True)
{% block title %}1220911101 符亚通 - Flask登录系统{% endblock %}
{% with messages = get_flashed_messages() %}
{% if messages %}
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
{% extends "base.html" %}
{% block title %}首页 - 1220911101 符亚通{% endblock %}
{% block content %}
{% endblock %}
{% extends "base.html" %}
{% block title %}用户登录 - 1220911101 符亚通{% endblock %}
{% block content %}
用户登录
还没有账号? 立即注册
{% endblock %}
{% extends "base.html" %}
{% block title %}用户注册 - 1220911101 符亚通{% endblock %}
{% block content %}
用户注册
已有账号? 立即登录
{% endblock %}
1.测试注册流程:
输入空数据、注册已存在用户、成功注册新用户
1.当前实现直接将密码明文存储在内存中,这存在什么安全隐患?应该如何改进?
安全隐患分析:
内存泄露风险:如果应用内存被转储,所有用户密码将直接暴露
数据库泄露风险:如果存储到数据库,管理员可以直接查看所有用户密码
违反隐私保护原则:不应存储用户原始密码
改进方案:
from werkzeug.security import generate_password_hash, check_password_hash
# 注册时存储哈希值
users[username] = generate_password_hash(password)
# 登录时验证
if check_password_hash(users[username], password):
# 验证通过
2.Flask的session是如何工作的?如果需要在多台服务器上部署应用,session存储需要做哪些调整?
默认使用客户端session,数据存储在cookie中
使用密钥签名防止篡改,但不加密内容
包含用户ID等基本信息
多服务器部署调整方案:
# 使用服务器端session存储
from flask_session import Session
app.config['SESSION_TYPE'] = 'redis' # 或其他服务器端存储
Session(app)
3.现有代码只验证了用户名是否存在,如果要添加以下验证规则应该如何实现:
密码长度不少于6位
用户名只能包含字母和数字
实现代码:
import re
def validate_username(username):
return bool(re.match('^[a-zA-Z0-9]+$', username))
@app.route('/register', methods=['POST'])
def register():
username = request.form['username']
password = request.form['password']
if len(password) < 6:
flash('密码长度不能少于6位')
elif not validate_username(username):
flash('用户名只能包含字母和数字')
elif username in users:
flash('用户名已存在')
else:
users[username] = generate_password_hash(password)
flash('注册成功')
4.如果要添加"记住我"功能,使登录状态可以保持更长时间,应该如何修改代码?
from datetime import timedelta
@app.route('/login', methods=['POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
remember = request.form.get('remember')
if check_password_hash(users[username], password):
session['username'] = username
if remember:
# 设置30天过期
app.permanent_session_lifetime = timedelta(days=30)
session.permanent = True
5.现有错误提示比较简略,如何给用户更友好的错误提示(如密码错误时提示剩余尝试次数)?
# 在应用全局添加尝试次数记录
login_attempts = {}
@app.route('/login', methods=['POST'])
def login():
username = request.form['username']
ip = request.remote_addr
# 初始化尝试次数
if ip not in login_attempts:
实验链接https://download.csdn.net/download/m0_73951999/91045318?spm=1001.2014.3001.5503