[python]Flask_Login

news2024/11/26 17:51:01

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

目录

安装

使用 

第一步,配置SECRET_KEY

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

第三步,用户类继承UserMixin

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

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

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

其他,注销与验证失败

调用流程逻辑

用户登录

 登录用户请求其他路由


安装

pip install flask-login

使用 

第一步,配置SECRET_KEY

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

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

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

app.config['SECRET_KEY'] = 'ec9439cfc6c796ae2029594d'

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

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

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

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

第三步,用户类继承UserMixin

定义User对象,

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

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

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,通过用户唯一标识去身份验证

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

@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进行身份验证,自定义身份验证逻辑,支持跨域请求的时候用到。

@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

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

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,将这个装饰在想要受身份限制的视图当中,只有登录进行身份验证后才能正常请求,不然会被拦截。

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

其他,注销与验证失败

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

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

注销的使用

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

调用流程逻辑

用户登录

 登录用户请求其他路由

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2190169.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Github优质项目推荐-第三期

文章目录 Github优质项目推荐 - 第三期一、【coding-interview-university】,305k stars - 软件工程师学习计划二、【drawdb】,20.1k stars - 数据库设计工具三、【twenty】,16k stars - 排名第一的开源 CRM四、【Douyin-Vue】,9.…

海南网站建设提升网站用户体验实用技巧

海南网站建设提升网站用户体验实用技巧 在当今数字时代,网站已成为企业展示形象和吸引客户的重要平台。尤其对于海南这一旅游胜地来说,优化网站用户体验显得尤为重要。以下是一些实用技巧,可帮助您提升网站的用户体验。 首先,确保…

柔性作业车间调度(FJSP)

1.1 调度问题的研究背景 生产调度是指针对一项可分解的工作(如产品制造),在尽可能满足工艺路线、资源情况、交货期等约束条件的前提下,通过下达生产指令,安排其组成部分(操作)所使用的资源、加工时间及加工的先后顺序,以获得产品制造时间或成本最优化的一项工作。 一般研究车间…

django的路由分发

前言: 在前面我们已经学习了基础的Django了,今天我们将继续学习,我们今天学习的是路由分发: 路由分发是Web框架中的一个核心概念,它指的是将不同的URL请求映射到对应的处理函数(视图)的过程。…

发现一篇瑞芯微RK3588上使用Gstreamer的文章(野火)

1. 前言 最近经常使用英伟达的Orin和瑞芯微RK3588做开发,自己还买了好几块开发板,很多需要自己琢磨,今天忽然发现了一篇文章,意外解决了一些之前的问题,以此作为记录: 文章链接:https://doc.embedfire.com/linux/rk356x/quick_start/zh/latest/lubancat_rk_software_har…

Redis基础三(redis的高级配置)

Redis进阶配置 一、Redis持久化操作 ​ 持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。(Redis 数据都放在内存中。如果机器挂掉,内存的数据就不存在。所以需要做持久化,将内存中的数据保存在磁盘&#xff0c…

Gralloc图形缓冲的分配过程

广告 首先帮我朋友打个广告 我们一起在运营一个视频号 感兴趣的可以帮忙点击右边这个小铃铛 铃铛 序 其实越往底下走在很多人嘴里就会变得很玄乎,变得不可思议,这里的gralloc就是一个native service,只是分装了一些调用接口,上…

使用Scikit-image进行图像处理入门

简介 在数据科学的广阔领域中,图像处理占据了重要的一席之地,为分析和处理视觉数据提供了各种工具和技术。Python 拥有丰富的库生态系统,为图像处理提供了多种选择,其中,scikit-image 凭借其强大且易用的功能脱颖而出…

记录使用gym和stable_baseline3训练出成功通关的贪吃蛇ai

参考自b站up林亦LYi的开源项目 传送门 本次只训练了cnn版本的 第一次接触这种项目,建python虚拟环境时出了点难以说清楚的小问题,安装不上requirement.txt中的gym库那个版本,折腾了一会,自己都乱了头绪,最后导致训练…

TMGM:黄金价格持稳,而WTI原油价格和天然气价格飙升

黄金价格顽强地拒绝下跌,昨天和周三继续抵制下行的趋势。 价格继续保持在近期的历史高位附近,很可能会有进一步上涨的动力。美元走强阻止了价格的进一步上涨,但总体上升趋势仍在进行中。 目前还没有明显的向下催化剂迹象,不过如…

c++联合体

// // Created by 徐昌真 on 2024/10/5. // #include <iostream> using namespace std;//定义一个结构体 struct DataS{ //内存空间独立int a;double b;char c[10]; };//定义一个联合体 union DataU{ //内存空间在一起int a;double b;char c[10]; };int main() {//创建…

Pikachu-目录遍历

目录遍历&#xff0c;跟不安全文件上传下载有差不多&#xff1b; 访问 jarheads.php 、truman.php 都是通过 get 请求&#xff0c;往title 参数传参&#xff1b; 在后台&#xff0c;可以看到 jarheads.php 、truman.php所在目录&#xff1a; /var/www/html/vul/dir/soup 图片…

奥博思软件总经理刘玉军受邀为项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 北京奥博思软件技术有限公司联合创始人、总经理刘玉军先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“高效协作的秘密&#xff1a;项目管理平台助力跨部门协作”。大会将于…

信息学奥赛复赛复习12-CSP-J2021-01分糖果-模运算、余数、打擂台求最值、最大值、最小值

PDF文档回复:20241005 **1 P7909 [CSP-J 2021] 分糖果 ** [题目描述] 红太阳幼儿园有 n 个小朋友&#xff0c;你是其中之一。保证 n≥2 有一天你在幼儿园的后花园里发现无穷多颗糖果&#xff0c;你打算拿一些糖果回去分给幼儿园的小朋友们 由于你只是个平平无奇的幼儿园小朋…

【数学分析笔记】第4章第4节 复合函数求导法则及其应用(2)

4. 微分 4.4 复合函数求导法则及其应用 【例4.4.3】 y e 1 cos ⁡ x ye^{\sqrt{1\cos x}} ye1cosx ​&#xff0c;求 y ′ y y′ 【解】 y ′ e 1 cos ⁡ x ⋅ 1 2 1 cos ⁡ x ⋅ ( − sin ⁡ x ) − sin ⁡ x 2 1 cos ⁡ x e 1 cos ⁡ x ye^{\sqrt{1\cos x}}\cdot\f…

【LeetCode】每日一题 2024_10_5 完成旅途的最少时间(二分答案)

前言 每天和你一起刷 LeetCode 每日一题~ 大家国庆节快乐呀~ LeetCode 启动&#xff01; 突然发现&#xff0c;国庆的每日一题&#xff0c;不是坐公交就是坐火车&#xff0c;不是坐火车就是做飞机&#xff0c;这就是你的国庆旅游计划吗&#xff01;力扣&#xff01; 题目&a…

今日凌晨,ChatGPT重磅更新!—— 我心目中的终极AGI界面

今日凌晨&#xff0c;ChatGPT重磅更新&#xff01;—— 我心目中的终极AGI界面 我心目中的终极 AGI 界面是一张空白画布&#xff08;canvas&#xff09;。 今日凌晨&#xff0c;OpenAI 发布 canvas&#xff0c;一个与 ChatGPT 合作写作和编程的新界面&#xff01; canvas&…

Linux基于CentOS学习【进程状态】【进程优先级】【调度与切换】【进程挂起】【进程饥饿】

目录 进程状态 状态决定了什么 进程等待方式——队列 进程状态的表现 挂起状态 基于阻塞的挂起——阻塞挂起 swap分区 进程状态表示 Z僵尸状态 进程的优先级 什么是进程的优先级 为什么会有进程的优先级 进程饥饿 Linux的调度与切换 切换 调度 queue [ 140 ]&am…

模拟算法(3)_Z字形变换

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 模拟算法(3)_Z字形变换 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 题目链…

VGG原理与实战

VGG网络结构 这也更好的块状结构,256个卷积核 卷积就是我们的一个特征图啊往往都会缩小 &#xff0c;然后的话但它通道不会变.卷积一般是使用我们的通道C变大,磁化但是它的通道就是我们那个H和W一般都会变小.下采样的意思就是使分辨率变小 vgg—block内的卷积层都是同结构的意…