python flask Flask-Login

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)