Python Flask-Login模块使用案例详解
作者:gymaisyl 发布时间:2021-10-14 21:01:17
先看一下flask-login模块的整体架构
基础的信息和全局配置这里就不多说,需要用到再斟酌也可以的。
这里也是针对每个模块较为常用的进行解释说明,后期再使用过程中遇到会进行补充。
Login_Manager
LoginManager是一个类,有多个方法和属性;此类初始化的对象用于保存用于登录的设置。实例:class:LoginManager
* *不绑定到特定应用程序,因此可以在代码的主体中创建一个,然后将其绑定到您的应用程序app中 工厂函数。
初始化一个LoginManager类对象
@login_manager.user_loader
def load_user(userid):
return User.get(userid)
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 UserMixin
class User(UserMixin,db.Model):
pass
2.应用程序的配置
创建 LoginManager 实例,然后与 app 绑定。、
from flask_login import LoginManager
login_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_id
return 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!'
来源:https://blog.csdn.net/gymaisyl/article/details/86649253


猜你喜欢
- 1. glob文件名模式匹配尽管glob API很小,但这个模块的功能却很强大。只要程序需要查找文件系统中名字与某个模式匹配的一组文件,就可
- 什么是接口测试接口测试主要用于检测外部系统与内部系统之间,以及系统内部各 个子系统之间的交互点。其测试的重点是,检查数据的交换、传递和控 制
- 效果如下:(动态效果可复制代码查看,案例中的图片可自行选择添加)代码如下:<!DOCTYPE html><html lan
- 脉冲星假信号频率的相对路径论证。首先看一下演示结果:实例代码:import numpy as npimport matplotlib.pyp
- 我一般看书喜欢做笔记,这份笔记不知道是什么时候看的什么书做的,也忘了是否是摘自其他地方,总之一份汇总,应该适合初学者,对于Javascrip
- 一.简介发展由来:随着信息技术的发展和硬件设备成本的降低,当今的互联网存在海量的数据,要想快速从这些数据中获取更多有效的信息,数据可视化是重
- 目标:在64位linux系统上编译出32位程序。操作:1.执行 go env 查看当前go环境配置2.执行 export GOARCH=38
- 直接看如下图解1、右击项目,查看提交历史2、选择要回滚的版本,点击回滚3、push回滚的内容:双击该回滚记录,弹出后,检查一下回滚的内容,没
- 目前已经有很多生成html的新闻系统,但是都是用的模板,本函数实现把asp页面产生的html代码保存成为一个html文件,这样就没有必要改动
- 桑基图简介很多时候,我们需要一种必须可视化数据如何在实体之间流动的情况。例如,以居民如何从一个国家迁移到另一个国家为例。这里演示了有多少居民
- 使用图层可以像素为单位精确定位页面元素,并且可以将层放置在页面的任意位置。当把页面元素放入图层之中时,还可以控制哪个显示在前面、哪个显示在后
- 事情是这样的五一假期第一天值班隔壁有点喜欢的小姐姐突然跑过来跟我聊天“微信账号切换来切换去 特别麻烦”“怎么能同时打开多个呢?”我心想,你有
- 视图在django中,视图对WEB请求进行回应视图接收reqeust对象作为第一个参数,包含了请求的信息视图就是一个Python函数,被定义
- 本文详细讲述了DRF认证组件的原理以及用法.源码剖析讲解DRF版本的时候我们都知道了,在dispatch方法里执行了initial方法来初始
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&
- 1.建表代码如下:-- Create table create table test ( dm1 char(3), dm2 char(3),
- 看看下面:function zr4(y)' 准备数据dim z(10)z(1)="ONE&q
- 前言为什么会做这个?因为我们把word转化为pdf,wps默认转化为文字pdf,而图片pdf要会员。网上确实也有网站可以实现免费的,但是未必
- 背景:调试服务最好的方式就是直接上机实践。对在公司的员工来说,在同一套服务上协同开发比在单独的环境上开发,应该会更有感觉。有问题可以一起发现
- 所以爱微网现在讲解先php内置函数 有大小写转换相关函数 文本html标签处理函数大小写有关函数 strtolower() strtoupp