Flask》》flask-login

csharp 复制代码
# 安装 pip install flask-login
csharp 复制代码
# 初始化配置
from flask import Flask
from flask_login import LoginManager

app = Flask(__name__)

# 1. 必须配置一个强密钥,用于加密 session 等[reference:7]
# 提示:生成 secret key 的命令行示例:python -c 'import secrets; print(secrets.token_hex())'[reference:8]
app.config['SECRET_KEY'] = '在此生成一个随机字符串'

# 2. 实例化并初始化 LoginManager
login_manager = LoginManager()
login_manager.init_app(app)

# 3. (可选) 配置登录页和消息[reference:9]
login_manager.login_view = 'login'  # 未登录时跳转到的登录视图函数名
login_manager.login_message = '请先登录以访问此页面。'  # 自定义提示信息
login_manager.login_message_category = 'info'


# 创建用户模型
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash

db = SQLAlchemy(app)
# 继承 UserMixin
# 不必在每个模型里重复编写 is_authenticated、is_active、is_anonymous、get_id 这四个几乎永远一样的实现。
class User(UserMixin, db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password_hash = db.Column(db.String(256), nullable=False)

    def set_password(self, password):
        """使用 werkzeug 生成安全的密码哈希"""
        self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        """验证用户输入的密码是否与哈希匹配"""
        return check_password_hash(self.password_hash, password)


## 实现用户加载回调
@login_manager.user_loader
def load_user(user_id):
    # Flask session 中存的是字符串,需要转换为整数再查询数据库[reference:12]
    return User.query.get(int(user_id))


## 登录视图 (Login View)
from flask import render_template, redirect, url_for, flash, request
from flask_login import login_user, logout_user
# 假设你使用 Flask-WTF 创建了一个 LoginForm 表单
from forms import LoginForm

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.username.data).first()
        if user and user.check_password(form.password.data):
            # 1. 核心函数:执行登录,如果勾选了"记住我",传递 remember=True [reference:14]
            # 手动调用的函数,用于将登录成功的用户信息写入 session
            login_user(user, remember=form.remember_me.data)
            
            # 2. 登录成功后,重定向到用户原本要访问的页面,如果没有则跳转到主页[reference:15]
            next_page = request.args.get('next')
            if next_page:
                return redirect(next_page)
            flash('登录成功!', 'success')
            return redirect(url_for('index'))
        else:
            flash('用户名或密码错误', 'danger')
    return render_template('login.html', form=form)
## 登出视图 (Logout View)
@app.route('/logout')
def logout():
    logout_user()
    flash('您已成功登出。', 'info')
    return redirect(url_for('login'))

## 保护视图与访问用户
#### 使用 @login_required 装饰器来保护任何需要登录才能访问的页面
from flask_login import login_required

@app.route('/dashboard')
@login_required
def dashboard():
    # 只有登录用户才能进入此视图
    return "这是您的个人控制面板。"


# 在所有视图和模板中,都可以通过 current_user 这个全局代理访问当前用户对象
from flask_login import current_user

@app.route('/profile')
@login_required
def profile():
    # 直接使用 current_user 获取用户信息
    return f"欢迎回来, {current_user.username}!"

<!DOCTYPE html>
<html>
<head>
    <title>我的应用</title>
</head>
<body>
    <nav>
        <!-- 使用 is_authenticated 判断用户状态,动态显示不同的导航菜单[reference:19] -->
        {% if current_user.is_authenticated %}
            <a href="#">欢迎, {{ current_user.username }}</a>
            <a href="{{ url_for('logout') }}">登出</a>
        {% else %}
            <a href="{{ url_for('login') }}">登录</a>
            <a href="{{ url_for('register') }}">注册</a>
        {% endif %}
    </nav>
    {% block content %}{% endblock %}
</body>
</html>

user_loader 调用时机

相关推荐
苏三说技术28 分钟前
AgentScope Java 2.0 正式发布了!
后端
ping某1 小时前
一个“日志备份”需求,为什么会牵出整个 Linux 日志系统?
后端·架构
王小王-1231 小时前
基于Python的车联网数据聚合与可视化分析平台设计与实现
python·车联网·新能源汽车·车联网聚合分析
血小溅1 小时前
Spring AI 对 Skill/MCP 的支持全景整理
后端
晓杰'1 小时前
从0到1实现Balatro游戏后端(8):Skip Blind与Tag奖励机制设计与实现
后端·websocket·typescript·项目实战·nestjs·状态管理·游戏服务器
叫我:松哥1 小时前
基于Flask框架的校园二手书籍交易平台,注重校园场景的特殊需求,通过学号认证保障用户真实性
后端·python·sqlite·flask·bootstrap
namexingyun2 小时前
开源前端生态如何成为 AI UI 生成的“燃料“:shadcn/ui、Tailwind CSS、Storybook 技术价值全解剖
java·前端·人工智能·python·ui·开源·ai编程
通信仿真爱好者2 小时前
第【17】期--考虑硬件损伤和不完美CSI的RIS-MISO系统的深度强化学习联合优化-python完整代码+参考文献
python·深度强化学习·ris
装不满的克莱因瓶2 小时前
自然语言处理常见任务——从文本理解到生成式AI的完整任务体系
人工智能·pytorch·python·深度学习·ai·自然语言处理
ptc学习者2 小时前
python 中描述符@property property 大概的样子
开发语言·python