先看一下flask-login模块的整体架构


基础的信息和全局配置这里就不多说,需要用到再斟酌也可以的。
这里也是针对每个模块较为常用的进行解释说明,后期再使用过程中遇到会进行补充。

Login_Manager


LoginManager是一个类,有多个方法和属性;此类初始化的对象用于保存用于登录的设置。实例:class:LoginManager * *不绑定到特定应用程序,因此可以在代码的主体中创建一个,然后将其绑定到您的应用程序app中 工厂函数。

初始化一个LoginManager类对象

login_manager = LoginManager()

init__app() – 配置该对象

login_manager.init_app(app)

user_loader() 回调函数

自定义回调函数,user_loader源代码参考下图:

源代码注释:

这将设置从会话重新加载用户的回调。 您设置的函数应该使用用户ID(“unicode”)并返回用户对象,如果用户不存在则返回“None”。


自定义回调函数

@login_manager.user_loader
def load_user(userid):return User.get(userid)

在执行该段代码之后,注册了load_user()这个自定义的callback。

reload_user()

1、首先获取user id,如果获取不到有效的id,就将user设为anonymous user
2、获取到id后,再通过@login_manager.user_loader装饰的函数获取到user对象,如果没有获取到有效的user对象,就认为是anonymous user
3、最后将user保存于request context中(无论是正常的用户还是anonymous用户)

源代码注释

这将ctx.user设置为由您的自定义user_loader回调函数加载的用户对象,该函数应使用从session获取的user_id检索用户对象。
语法示例:
来自于flask_login导入LoginManager
@ login_manager.user_loader
def any_valid_func_name(user_id):
#使用给定的user_id获取用户对象,
#如果您使用SQLAlchemy,例如:
user_obj = User.query.get(int(user_id))
return user_obj
让你定义这个self.user_callback的原因:
因为我们不知道你将如何/在哪里加载用户对象。

(实例属性的配置)

login-view :验证失败跳转的界面

login_manager.login_view = "/" 跳转到/首页目录

login-message:用户重定向到登录页面时闪出的消息

login_manager.login_message ='Please login first!'

refresh-view:用户需要重新进行身份验证时要重定向到的视图的名称。

login_manager.refresh_view = "/"

needs-refresh-message:用户重定向到“需要刷新”页面时闪出的消息。

login_manager.needs_refresh_message = 'Refresh for login!'

session-protection:使用会话保护的模式。这可以是'basic'(默认)或'strong',或None禁用

login_manager.session_protection = ‘strong’

utils

Login_required

current_user.is_authenticated,判断当前用户是否认证,如果没有认证的话就执行unauthorized(),
unauthorized()会重定向到login_view参数设置的路由函数中去,所以在实例化LoginManager后要设置login_view属性,
当用户没有登陆时,会自动重定向到登陆界面,没有设置会返回401错误, 用户登陆后,这个装饰器就直接返回func(*args, **kwargs),相当于没有包装一样,装饰器起到包装接口的作用。


源码解释:

1、如果使用此装饰视图,它将确保在调用实际视图之前登录并验证当前用户。如果验证不通过,那么则会调用LoginManager.unauthorized()
2、#如果request method为例外method,即在EXEMPT_METHODS中的method,可以不必鉴权
3、如果_login_disabled为True则不必鉴权

Login_user

用户登录操作,用户在通过自定义的login视图函数,通过验证并登录成功后,需要

 # Flask-Login中的login_user可以记录/保存当前成功登陆的用户login_user(user)

logout_user

登出功能类似,除了基本的操作外,还需要把flask-login中的登出进行操作

@app.route('/logout')
@login_required
def logout():logout_user()return 'Logged out successfully!'

UserMixin

is_authenticated
当用户通过验证时,也即提供有效证明时返回 True 。(只有通过验证的用户会满足 login_required 的条件。)
is_active
如果这是一个活动用户且通过验证,账户也已激活,未被停用,也不符合任何你 的应用拒绝一个账号的条件,返回 True 。不活动的账号可能不会登入(当然, 是在没被强制的情况下)。
is_anonymous
如果是一个匿名用户,返回 True 。(真实用户应返回 False 。)
get_id()
返回一个能唯一识别用户的,并能用于从 user_loader 回调中加载用户的 unicode 。注意着 必须 是一个 unicode —— 如果 ID 原本是 一个 int 或其它类型,你需要把它转换为 unicode 。
要简便地实现用户类,你可以从 UserMixin 继承,它提供了对所有这些方法的默认 实现。(虽然这不是必须的。)

Flask-Login 一般使用基础流程

Flask-Login 通过 user session,提供登录的常见任务,比如登入 (logging in)、登出 (logging out) 和当前用户 (current user)

login_user():实现用户的登入,一般在登入的视图函数中调用

logout_user():实现登出功能

current_user 属性:获取当前用户
如果需要页面是授权用户才可见,在相应视图函数前加上 @login_required 装饰器进行声明即可,@login_required 装饰器对于未登录用户访问,默认处理是重定向到 LoginManager.login_view 所指定的视图

1.定义 User
登录基于用户,需要定义 User 类,Flask-Login 规定 User 类必须实现三个属性和一个方法:

is_authenticated 属性

is_active 属性

is_anonymous 属性

get_id() 方法

最简单的方法是从 UserMixin 类继承,该类提供了默认的实现。

from flask_login import UserMixinclass User(UserMixin,db.Model):pass

2.应用程序的配置
创建 LoginManager 实例,然后与 app 绑定。、

from flask_login import LoginManagerlogin_manager = LoginManager()login_manager.login_view = 'login'
login_manager.login_message_category = 'info'
login_manager.login_message = 'Access denied.'login_manager.init_app(app)

3.user_loader 回调函数
user session 记录的是用户 ID (user_id),回调函数的作用就是通过 user_id 返回对应的 User 对象。user_loader 回调函数在 user_id 非法的时候不应该抛出异常,而要返回 None。没有这个回调函数的话,Flask-Login 将无法工作

@login_manager.user_loader
def load_user(user_id):if query_user(user_id) is not None:curr_user = User()curr_user.id = user_idreturn curr_user

4.登入功能实现

@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':user_id = request.form.get('userid')user = query_user(user_id)if user is not None and request.form['password'] == user['password']:curr_user = User()curr_user.id = user_id# 通过Flask-Login的login_user方法登录用户login_user(curr_user)return redirect(url_for('index'))flash('Wrong username or password!')# GET 请求
return render_template('login.html')

关键就是 login_user(curr_user) 这句代码,之前要构建 User 对象,并指定 id。

5.登出功能实现

@app.route('/logout')
@login_required
def logout():logout_user()return 'Logged out successfully!'

Flask-Login使用详解相关推荐

  1. Flask request 属性详解

    一.关于request 在Flask的官方文档中是这样介绍request的:对于 Web 应用,与客户端发送给服务器的数据交互至关重要.在 Flask 中由全局的 request 对象来提供这些信息. ...

  2. Docker(24)- docker login 命令详解

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 登录 Docker 镜像仓 ...

  3. linux添加用户命令_Linux useradd命令添加新用户图文详解

    在Linux 系统中,可以使用 useradd 命令新建用户,此命令的基本格式如下: [root@localhost ~]#useradd [选项] 用户名 该命令常用的选项及各自的含义,如表 1 所 ...

  4. python flask安装_python flask安装和命令详解

    Flask Web开发实战学习笔记 Flask简介 Flask是使用Python编写的Web微框架.Web框架可以让我们不用关 心底层的请求响应处理,更方便高效地编写Web程序.因为Flask核心简 ...

  5. 框架详解_详解:python Web框架flask表单实现(建议收藏)

    今天为大家带来的内容是:python框架flask表单实现详解 文章内容主要介绍了python框架flask表单实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需 ...

  6. flask导出Excel报表详解

    在日常开发中,导出数据报表可谓必备技能,在后台管理中,很多模块都需要数据报表,现在我们一起来学习一下 flask 如何导出数据报表. 没有实例的讲解很不容易理解,本文我们依然从实际项目来讲解,对 &q ...

  7. 微信小程序python flask_Python Flask 搭建微信小程序后台详解

    前言: 近期需要开发一个打分的微信小程序,涉及到与后台服务器的数据交互,因为业务逻辑相对简单,故选择Python的轻量化web框架Flask来搭建后台程序.因为是初次接触小程序,经过一番摸索和尝试,个 ...

  8. Python Flask 搭建微信小程序后台详解

    前言: 近期需要开发一个打分的微信小程序,涉及到与后台服务器的数据交互,因为业务逻辑相对简单,故选择Python的轻量化web框架Flask来搭建后台程序.因为是初次接触小程序,经过一番摸索和尝试,个 ...

  9. flask与js交互的示例代码_Frida Java Hook 详解(安卓9):代码及示例(上)

    Frida Java Hook 详解(安卓9):代码及示例(上) 前言 1.1 FRIDA SCRIPT的"hello world" 1.1.1 "hello world ...

  10. flask ajax小程序,Python Flask 搭建微信小程序后台详解

    后台程序返回了数据后,第三步就是小程序该怎么接收返回数据并进行相关业务逻辑处理. 小程序接收返回数据.Python-Flask向小程序返回了JSON格式的数据后,小程序的wx.requset()函数里 ...

最新文章

  1. printf函数输出详解
  2. TCP 三次握手四次挥手
  3. 蒙提霍尔悖论(三门问题)终极分析(补充)附完整源码
  4. 浅析 record 使用场景
  5. 利用可视化软件navicat查看表的sql语句
  6. 叠置分析(涉及结果属性和输入图层属性的关系)
  7. bzoj1005 [HNOI2008]明明的烦恼 prufer+组合数学
  8. .net core下的dotnet全局工具
  9. 好想找一个灵魂伴侣,然后带着他一起周游世界,会实现吗?
  10. 【冷门】十字链表法图解
  11. ipxspx协议linux,win7\win10 IPX协议自动安装器
  12. 群主微信sdk说明地址
  13. JVm - Parallel Scavenge 垃圾回收器
  14. 企业引入人脸识别考勤 想要代打卡?没门!
  15. 【论文晨读】一种移动机器人全局最优路径规划算法 孟 偲2008
  16. 安全架构-HTTP协议幂等性
  17. 读--《谁动了我的奶酪》
  18. 童年的回忆小游戏来了——贪吃蛇,快来自己动手写一个属于自己的小游戏吧
  19. 多张照片合成视频和给视频添加背景音乐
  20. 利用Jquery Lazyload JS插件实现网页图片延迟加载

热门文章

  1. IOS学习笔记58--IOS7新特性之XCODE
  2. 服务器推送/客服端拉扯
  3. java高校校园一卡通系统
  4. 【调剂】东南大学2022年软件学院(苏州)硕士生调剂信息
  5. 计算两个日期相差 几年几个月几日
  6. Linux 进程管理与服务
  7. C语言知识点---文件
  8. Ubuntu下利用Opencv进行点阵汉字的字模读取与显示
  9. 存储区域网(SAN-Storage Area Network)
  10. XmlHttp.onreadystatechange属性