Flask 中文教程

第四部分:实战项目篇
第12章 入门级实战:个人博客系统
第13章 进阶级实战:RESTful API 服务
第五部分:部署运维与优化篇
第14章 Flask 应用部署
第15章 性能优化与安全加固
第六部分:问题解决与进阶篇
第16章 常见问题与解决方案
第17章 Flask 进阶与扩展

9.1 Flask-Login 扩展

Flask-Login 扩展教程:从安装到实战

Flask 中文教程

本教程全面讲解Flask-Login扩展,包括安装、配置、用户模型适配、登录、注销、记住我功能和登录保护装饰器的实现。适合Flask新手学习。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

Flask-Login 扩展教程

简介

Flask-Login 是 Flask 的一个扩展,专门用于管理用户的登录会话和认证。它简化了用户登录、注销、记住我功能以及路由保护等常见任务的实现,帮助开发者快速构建安全的 Web 应用。本教程将从基础开始,详细介绍如何使用 Flask-Login,适合初学者入门。

扩展安装

安装 Flask-Login 非常简单,只需使用 pip 工具。打开终端或命令提示符,运行以下命令:

pip install flask-login

确保您的 Python 环境已设置好,并且有网络连接。安装完成后,可以在 Python 脚本中导入 Flask-Login。

初始化配置

在 Flask 应用中配置 Flask-Login,通常在主应用文件中进行。以下是步骤和代码示例:

from flask import Flask
from flask_login import LoginManager

# 创建 Flask 应用实例
app = Flask(__name__)
app.secret_key = 'your-secret-key'  # 设置会话密钥,用于安全存储用户会话数据

# 初始化 LoginManager
login_manager = LoginManager()
login_manager.init_app(app)  # 将 LoginManager 与 Flask 应用关联
login_manager.login_view = 'login'  # 设置未登录用户重定向的登录页面视图函数名称
  • app.secret_key:这是一个重要的安全设置,用于加密会话数据。在实际应用中,应使用一个复杂且保密的字符串,可以通过环境变量或其他安全方式设置。
  • login_manager.login_view:指定当用户访问受保护路由但未登录时,重定向到的登录页面。这里的 'login' 是视图函数的名称,需要在应用中定义。

用户模型适配

Flask-Login 需要一个用户类来代表系统中的用户。为了简化,可以使用 UserMixin 混入类,它为类添加了 Flask-Login 所需的默认方法。

from flask_login import UserMixin

class User(UserMixin):
    def __init__(self, id, username, password):
        self.id = id  # 用户唯一标识符,例如数据库中的主键
        self.username = username
        self.password = password  # 在实际应用中,应使用哈希存储密码

    # UserMixin 自动提供了以下方法:
    # - is_authenticated: 返回 True 表示用户已认证
    # - is_active: 返回 True 表示用户账户是活动的
    # - is_anonymous: 返回 False 表示这不是匿名用户
    # - get_id: 返回用户的 id 作为字符串

    # 您还可以根据需要添加其他方法,如检查角色或权限

在实际应用中,用户数据通常存储在数据库中。这里使用简单的类作为示例,但需要确保从数据库加载用户对象。

为了加载用户,需要定义一个回调函数并使用 login_manager.user_loader 装饰器:

@login_manager.user_loader
def load_user(user_id):
    # 这里应从数据库或其他数据源根据 user_id 加载用户
    # 假设有一个函数 get_user_by_id 返回 User 实例
    user = get_user_by_id(user_id)  # 模拟数据库查询
    if user:
        return user
    return None  # 如果用户不存在,返回 None

登录功能实现

登录功能通常涉及一个表单来接收用户凭证,并进行验证。以下是一个基本实现:

from flask import request, render_template, redirect, url_for, flash
from flask_login import login_user

# 假设有一个函数 authenticate_user 来验证用户名和密码
def authenticate_user(username, password):
    # 模拟数据库查询
    user = get_user_by_username(username)  # 从数据库获取用户
    if user and user.password == password:  # 在实际应用中,应比较哈希值
        return user
    return None

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        remember = 'remember' in request.form  # 检查表单中是否有“记住我”复选框
        user = authenticate_user(username, password)
        if user:
            login_user(user, remember=remember)  # 登录用户,remember 参数启用记住我功能
            flash('登录成功!', 'success')  # 显示成功消息
            return redirect(url_for('index'))  # 重定向到首页或其他页面
        else:
            flash('用户名或密码错误!', 'danger')  # 显示错误消息
    return render_template('login.html')  # 渲染登录页面模板
  • login_user:这是 Flask-Login 的核心函数,用于登录用户。设置 remember=True 时,会启用“记住我”功能,让用户会话持续一段时间。
  • flash:用于在页面间传递消息,通常在模板中使用 get_flashed_messages() 显示。

登录页面模板(login.html)可能包括表单字段和一个“记住我”复选框。

注销功能实现

注销功能让用户可以安全退出会话。实现如下:

from flask_login import logout_user

@app.route('/logout')
@login_required  # 使用装饰器确保只有登录用户才能访问
def logout():
    logout_user()  # 注销当前用户
    flash('您已成功注销!', 'success')
    return redirect(url_for('login'))  # 重定向到登录页面
  • logout_user:清除用户的登录状态。
  • @login_required:这是一个保护装饰器,确保只有已登录用户才能执行注销操作。如果未登录,Flask-Login 会自动重定向到配置的登录页面。

记住我功能

“记住我”功能允许用户在一段时间内保持登录状态,即使关闭浏览器。在 login_user 中设置 remember=True 即可启用。Flask-Login 默认使用 cookie 来存储会话信息,可以通过 Flask 的配置调整 REMEMBER_COOKIE_DURATION 来控制持续时间。

# 在登录视图中,如果用户选中“记住我”复选框,则设置 remember=True
# 不需要额外代码,Flask-Login 会自动处理会话持久化

默认情况下,“记住我” cookie 的有效期为 365 天,但可以在应用配置中修改:

app.config['REMEMBER_COOKIE_DURATION'] = timedelta(days=7)  # 例如设置为7天

登录保护装饰器

@login_required 装饰器用于保护路由,确保只有登录用户才能访问。如果未登录,用户会被重定向到 login_manager.login_view 指定的页面。

from flask_login import login_required

@app.route('/profile')
@login_required
def profile():
    # 这里可以访问当前登录用户的信息
    user = current_user  # Flask-Login 提供的全局变量,代表当前用户
    return render_template('profile.html', user=user)
  • current_user:一个全局变量,代表当前登录的用户。如果用户未登录,它是一个匿名用户对象(即 is_authenticated 返回 False)。

此外,可以自定义未登录时的处理方式,例如通过设置 login_manager.unauthorized_handler 来返回特定响应:

@login_manager.unauthorized_handler
def unauthorized():
    return redirect(url_for('login'))  # 默认重定向,可以自定义

总结

Flask-Login 是一个强大的扩展,极大简化了 Flask 应用中的用户认证管理。通过本教程,您学会了如何安装和配置 Flask-Login、适配用户模型、实现登录、注销和记住我功能,并使用 @login_required 装饰器保护路由。在实际开发中,请确保结合数据库和密码哈希(如使用 Werkzeug 的 generate_password_hashcheck_password_hash)来增强安全性。继续练习,您将能构建出更加健壮和安全的 Web 应用!

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包