Flask-Login 实战:用户登录、登出与 Session 管理
1. 前置准备与概述
1.1 为什么选 Flask-Login?
手动写 Session 管理、登录状态同步、路由保护太容易踩坑(比如 Cookie 劫持防护、未登录跳转、「记住我」功能的 Cookie 有效期)。Flask-Login 把这些通用逻辑封装好了,只需要我们实现核心的业务钩子和基础路由就能搞定一套规范的登录系统。
1.2 核心能力列表
- ✅ 用户 Session 的创建、销毁与维护
- ✅
current_user全局当前登录用户对象 - ✅
@login_required一键保护路由 - ✅ 「记住我」功能的自动 Cookie 管理
- ✅ 未登录/无权限时的统一重定向与提示
- ✅ 匿名用户的默认实现
1.3 安装
2. 全局初始化与基础配置
2.1 创建独立的扩展管理器
为了避免循环依赖(比如 app/__init__.py 同时导入 models 和 auth,而 auth 又导入 app),我们把所有第三方扩展的初始化放到单独的文件里:
2.2 在应用工厂中绑定扩展并加载用户
Flask 推荐用应用工厂模式管理多环境,所以扩展要在工厂里动态绑定 app:
3. 准备带 UserMixin 的用户模型
Flask-Login 要求用户对象实现 4 个核心属性/方法:
is_authenticated:是否已登录(返回 True/False)is_active:账户是否激活(返回 True/False)is_anonymous:是否是匿名用户(返回 True/False)get_id():返回用户的唯一字符串/数字 ID
UserMixin 已经帮我们实现了这 4 个(除了 is_active 可能需要根据业务覆盖),直接继承就行:
4. 核心路由:登录与登出
4.1 登录路由(处理表单验证、密码比对、Session 创建)
假设我们用了 Flask-WTF 做表单(如果没有,用原生 request.form 也可以):
4.2 登出路由(一键清除 Session)
5. 路由保护的进阶玩法
5.1 基础保护:@login_required 装饰器
直接加在路由函数的最前面(注意顺序:装饰器从下往上执行):
5.2 局部保护:仅特定请求方式需要登录
比如评论功能,看评论公开,写评论必须登录:
5.3 自定义权限装饰器
比如管理员专属或编辑专属的路由:
6. 模板中使用 current_user
current_user 同样在 Jinja2 模板中全局可用,可以用来动态渲染导航栏:
7. 关键安全提示
SECRET_KEY必须保密且随机:生产环境用secrets.token_hex(32)生成,放在环境变量(比如.env+python-dotenv)中,绝对不能上传到代码仓库。- 防止 open redirect 漏洞:处理
next_page时,只允许以/开头的相对路径,禁止外部 URL。 - HTTPS 必须开启:生产环境设置
SESSION_COOKIE_SECURE=True,否则 Cookie 可能被中间人劫持。 - 密码不能明文存储:必须用
werkzeug.security.generate_password_hash加密存储。 - 注意装饰器的顺序:自定义权限装饰器要放在
@login_required后面(从下往上执行:先检查登录,再检查权限)。
8. 速查总结
🔗 扩展阅读

