Flask-Login 使用教学(完整示例)
安装套件
pip install flask flask-login
Flask-Login 的核心概念
| 组件 | 作用 |
|---|---|
LoginManager |
初始化扩展,管理登录配置和回调。 |
UserMixin |
为用户模型提供必需的属性和方法实现。 |
@login_manager.user_loader |
核心回调,根据会话中的 ID 加载用户对象。 |
login_user(user, remember=...) |
在登录成功时调用,将用户 ID 存入会话。 |
logout_user() |
在登出时调用,清除会话中的用户 ID。 |
@login_required |
视图装饰器,强制用户必须登录才能访问。 |
current_user |
全局代理对象,代表当前登录的用户。 |
创建你的 User 模型(最重要)
你必须提供一个用户类,其中要包含至少:
- get_id()
- is_authenticated
- is_active
- is_anonymous
如果继承 UserMixin 就完成了!
from flask_login import UserMixin
# 示例:简单的用户资料(用字典模拟数据库)
USERS = {
"test@example.com": {"password": "123456"}
}
class User(UserMixin):
def __init__(self, id):
self.id = id # 通常使用 email 或数据库中的 id
完整 Flask-Login 配置
from flask import Flask, render_template_string, request, redirect, url_for
from flask_login import LoginManager, login_user, logout_user, login_required, current_user
app = Flask(__name__)
app.secret_key = "your_secret_key"
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "login" # 没登录访问保护页面会跳到 login
🔑 Flask-Login 需要 user_loader
它必须根据用户 ID 还原用户对象:
@login_manager.user_loader
def load_user(user_id):
if user_id in USERS:
return User(user_id)
return None
登录页面(POST 处理登录)
@app.route("/login", methods=["GET", "POST"])
def login():
if request.method == "POST":
email = request.form["email"]
password = request.form["password"]
# 检查用户是否存在
if email in USERS and USERS[email]["password"] == password:
user = User(email)
login_user(user) # 登录成功
return redirect(url_for("protected"))
return "❌ 登录失败!账号或密码错误"
return '''
<form method="POST">
Email: <input type="text" name="email"><br>
Password: <input type="password" name="password"><br>
<button>登录</button>
</form>
'''
受保护页面(必须登录)
@app.route("/protected")
@login_required
def protected():
return f"欢迎,{current_user.id}!这是受保护的页面。"
登出功能
@app.route("/logout")
@login_required
def logout():
logout_user()
return "你已经成功登出!"
主页
@app.route("/")
def index():
if current_user.is_authenticated:
return f"你已登录:{current_user.id} <br> <a href='/logout'>登出</a>"
return "你还没有登录 <a href='/login'>登录</a>"
完整可运行项目
把以下代码贴到 app.py 直接运行即可:
from flask import Flask, request, redirect, url_for
from flask_login import (
LoginManager, UserMixin, login_user, logout_user,
login_required, current_user
)
app = Flask(__name__)
app.secret_key = "your_secret_key"
USERS = {
"test@example.com": {"password": "123456"}
}
class User(UserMixin):
def __init__(self, id):
self.id = id
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "login"
@login_manager.user_loader
def load_user(user_id):
if user_id in USERS:
return User(user_id)
return None
@app.route("/")
def index():
if current_user.is_authenticated:
return f"已登录:{current_user.id} <br><a href='/logout'>登出</a>"
return "你还未登录 <a href='/login'>登录</a>"
@app.route("/login", methods=["GET", "POST"])
def login():
if request.method == "POST":
email = request.form["email"]
password = request.form["password"]
if email in USERS and USERS[email]["password"] == password:
user = User(email)
login_user(user)
return redirect(url_for("protected"))
return "登录失败!账号或密码错误"
return '''
<form method="POST">
Email: <input name="email"><br>
Password: <input type="password" name="password"><br>
<button>登录</button>
</form>
'''
@app.route("/protected")
@login_required
def protected():
return f"欢迎进入受保护页面,{current_user.id}!"
@app.route("/logout")
@login_required
def logout():
logout_user()
return "你已登出!"
if __name__ == "__main__":
app.run(debug=True)