Flask-Login?是 Flask 的用戶管理擴展,提供?用戶身份驗證、會話管理、權限控制?等功能。
適用于:
??用戶登錄、登出
??記住用戶(“記住我” 功能)
??限制未登錄用戶訪問某些頁面
??用戶會話管理
?1. 安裝 Flask-Login
pip install flask-login flask-sqlalchemy
main.py
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_userapp = 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
<!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
<!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
??登出:http://127.0.0.1:5000/logout