Flask-Login 是 Flask 的用户管理扩展,提供 用户身份验证、会话管理、权限控制 等功能。
适用于:
• 用户登录、登出
• 记住用户("记住我" 功能)
• 限制未登录用户访问某些页面
• 用户会话管理
1. 安装 Flask-Login
bash
pip install flask-login flask-sqlalchemy
python
from flask import Flask, render_template, redirect, url_for, request, flash
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
app = Flask(__name__)
# 配置 Flask 和数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' # 使用 SQLite 数据库
app.config['SECRET_KEY'] = 'your_secret_key' # Flask-Login 需要 secret key
db = SQLAlchemy(app)
login_manager = LoginManager(app)
# 定义用户模型
class User(UserMixin, db.Model): # UserMixin 提供 Flask-Login 必需的方法
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(100), unique=True, nullable=False)
password = db.Column(db.String(200), nullable=False) # 真实应用需加密密码
# 创建数据库表(仅需运行一次)
with app.app_context():
db.create_all()
# Flask-Login 加载用户的回调函数
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id)) # 通过 ID 获取用户
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
if not username or not password:
flash("用户名和密码不能为空!")
return redirect(url_for('register'))
# 检查用户是否已存在
existing_user = User.query.filter_by(username=username).first()
if existing_user:
flash("用户名已存在,请选择其他用户名")
return redirect(url_for('register'))
# 创建新用户并保存到数据库
new_user = User(username=username, password=password) # 这里应加密密码
db.session.add(new_user)
db.session.commit()
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.get('username')
password = request.form.get('password')
# 查找用户
user = User.query.filter_by(username=username).first()
if user and user.password == password: # 这里应使用加密密码验证
login_user(user) # 登录用户
flash("登录成功!")
return redirect(url_for('dashboard'))
flash("用户名或密码错误")
return redirect(url_for('login'))
return render_template('login.html')
@app.route('/dashboard')
@login_required # 保护此路由,未登录用户无法访问
def dashboard():
return f"欢迎 {current_user.username}!这是您的仪表盘。 <a href='/logout'>登出</a>"
@app.route('/logout')
@login_required
def logout():
logout_user()
flash("您已成功退出!")
return redirect(url_for('login'))
if __name__ == "__main__":
app.run(debug=True)
templates/login.html
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
<label>用户名:</label>
<input type="text" name="username" required>
<label>密码:</label>
<input type="password" name="password" required>
<button type="submit">登录</button>
</form>
</body>
</html>
templates/register.html
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
<label>用户名:</label>
<input type="text" name="username" required>
<label>密码:</label>
<input type="password" name="password" required>
<button type="submit">注册</button>
</form>
</body>
</html>
运行,然后访问:
• 注册:http://127.0.0.1:5000/register
• 登录:http://127.0.0.1:5000/login
• 仪表盘(必须登录):http://127.0.0.1:5000/dashboard