[python]Flask_Login

news/2024/10/5 18:20:55 标签: python, flask, 开发语言

flask_login是flask框架中的一个拓展功能,用于更快捷的实现用户会话管理功能,主要处理登录,注销和长时间会话存储的功能处理。

目录

安装

使用 

第一步,配置SECRET_KEY

 第二步,创建LoginManager实例绑定app

第三步,用户类继承UserMixin

第四步,实现加载用户方法

第五步,使用登录身份验证

第六步,受身份验证保护的视图

其他,注销与验证失败

调用流程逻辑

用户登录

 登录用户请求其他路由


安装

pip install flask-login

使用 

第一步,配置SECRET_KEY

首先我们要在flask中的config里配置一个键值对:

SECRET_KEY:'你自己设置的字符串'

这个key的作用在于加密cookie等其他提升安全性的地方,还会用来管理api用户身份验证

python">app.config['SECRET_KEY'] = 'ec9439cfc6c796ae2029594d'

 第二步,创建LoginManager实例绑定app

创建一个登录管理器的实例,并绑定到flask中的app上

loginManager的作用在于:随着flask中app的生命周期去跟踪用户的登录状态与会话数据(可以理解为,额外开辟了内存去进行session的管理与存储功能)

python"># 写法一
login_manager = LoginManager(app)
# 写法二
login_manager = LoginManager()
login_manager.init_app(app)

第三步,用户类继承UserMixin

定义User对象,

usermixin能够让flask_login正确识别我们定义的user类,并且还额外提供了方法去完成工作。

像是is_authenticated(用户是否认证)、is_active(用户是否活跃) 和 is_anonymous(是否为匿名用户)

python">class User(db.Model, UserMixin):  # 继承一下flask_login中的UserMixin
    __tablename__ = 'userinfo'

    id: Mapped[int] = mapped_column(Integer, primary_key=True)
    nickname: Mapped[str] = mapped_column(String, nullable=False)
    mail: Mapped[str] = mapped_column(String, nullable=False)
    password: Mapped[str] = mapped_column(String, nullable=False)
    groupid: Mapped[int] = mapped_column(Integer)

第四步,实现加载用户方法

flask-login中提供了两种方法去进行用户认证,对应的我们需要去返回用户实例给他去进行存储

第一种是: user_loader,通过用户唯一标识去身份验证

是普遍使用的会话管理方法,用户在登录的时候,将用户唯一标识和用户实例存起来

python">@login_manager.user_loader  # 我们需要返回一个当前会话的用户实例给flask_login
def load_user(user_id):
    # 这里的db.session.get是sqlalchemy中的方法[根据uid去库里拿数据再创建为一个User实例返回]
    # 无论是什么方法,只要给其返回一个对象的实例就好了
    return db.session.get(User, user_id)  # 如果没有对应的实例,返回None

后续该用户在

第二种是:request_loader,每一次请求都去进行身份验证

通常在使用token进行身份验证,自定义身份验证逻辑,支持跨域请求的时候用到。

python">@login_manager.request_loader
def request_loader(request):
    email = request.form.get('email')
    if email not in users:
        return

    user = User()
    user.id = email
    return user

第五步,使用登录身份验证

python">def do_login(mail: str, password: str) -> bool:
    # 这里查询User表,条件为mail等于传进来的参数mail
    query = Select(User).where(User.mail == mail)
    # 再扔到这里去执行,拿返回值
    attempted_user = db.session.scalar(query)
    # 如果账号存在,且密码匹配的话
    if attempted_user and attempted_user.check_password_correction(password):
        # 做一个登录的动作
        # 调用了flask login方法,在返回的头中会加上set-cookie字段
        login_user(attempted_user)
        return True  # 登录成功 返回一个true

    return False  # 验证没通过返回false

# api:登录接口
@user_bp.route('/login', methods=['POST'])
def user_login():
    mail = request.form['mail']
    password = request.form['password']
    # note:首先对字段判空
    # 判断传进来的参数是否合法
    if not Tool.check_field(mail, max_len=50) or not Tool.check_field(password, min_len=6, max_len=36):
        return Response.fail(message='非法参数')
    # 登录 存放session
    user_service.do_login(mail, password)
    return Response.success(message='登录成功')

第六步,受身份验证保护的视图

flask_login中有一个login_required,将这个装饰在想要受身份限制的视图当中,只有登录进行身份验证后才能正常请求,不然会被拦截。

python"># api:发布文章
@post_bp.route('/publish', methods=['POST'])
@login_required
def post_publish():
    return Response.success(message='发布成功')

其他,注销与验证失败

可以自定义身份验证失败后返回的响应

python">@login_manager.unauthorized_handler
def unauthorized():
    return redirect(url_for('login'))  # 重定向到登录页面

注销的使用

python">@app.route('/logout')
def logout():
    flask_login.logout_user()
    return 'Logged out'

调用流程逻辑

用户登录

 登录用户请求其他路由


http://www.niftyadmin.cn/n/5691145.html

相关文章

新闻推荐系统:Spring Boot的可扩展性

6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…

黑马JavaWeb开发跟学(八)MySQL多表查询以及MyBatis基础

黑马JavaWeb开发跟学八.MySQL多表查询以及MyBatis基础 数据库开发-MySQL1. 多表查询1.1 概述1.1.1 数据准备1.1.2 介绍1.1.3 分类 1.2 内连接1.3 外连接1.4 子查询1.4.1 介绍1.4.2 标量子查询1.4.3 列子查询1.4.4 行子查询1.4.5 表子查询 1.5 案例 2. 事务2.1 介绍2.2 操作2.3 …

零样本提示ChatGPT

导包 from openai import OpenAI import json client OpenAI(base_url"https://api.chatanywhere.tech/v1" )2.设置提示,提示最好放在3个引号内或3个#号内 prompt f""" 生成一个由三个虚构的订单信息所组成的列表,以JSON格…

【Unity】双摄像机叠加渲染

一、前言 之前我在做我的一个Unity项目的时候,需要绘制场景网格的功能,于是就用到了UnityEngine.GL这个图形库来绘制,然后我发现绘制的网格线是渲染在UI之后的,也就是说绘制出来的图形会遮盖在UI上面,也就导致一旦这些…

前端学习第三天笔记 JavaScript JavaScript的引入 数据类型 运算符 条件语句 字符串

这里写自定义目录标题 JavaScriptJavaScript引入到文件嵌入到HTML文件中引入本地独立js文件引入网络来源文件 JavaScript的注释方式嵌入在HTML文件中的注释JavaScript的输出方式数据类型原始类型(基础类型)合成类型(复合类型) 运算…

Linux环境基础开发工具使用(2)

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Linux环境基础开发工具使用(2) 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. Li…

如何快速学习K8s

1.背景 最近在学习k8s相关,也写了相关的一些技术文。有童鞋私信我是怎么学k8s。我今天分享下相关的学习历程。 2.过程 工欲善其事必先利其器,除了电脑,还要有完整配套的资料去参考学习。所以大家应该先找一些比较完整的k8s资料去看&#xf…

Oracle SQL语句没有过滤条件,究竟是否会走索引??

答案是:可能走索引也可能不走索引,具体要看列的值可不可为null,Oracle不会为所有列的nullable属性都为Y的sql语句走索引。 例子: create table t as select * from dba_objects; CREATE INDEX ix_t_name ON t(object_id, objec…