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

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)
1
2
3
在执行该段代码之后,注册了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)
1
2

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

7
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!'

flak_login用法的更多相关文章

  1. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  2. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  3. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  4. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  5. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  6. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  7. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  8. chattr用法

    [root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...

  9. 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)

    vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...

  10. [转]thinkphp 模板显示display和assign的用法

    thinkphp 模板显示display和assign的用法 $this->assign('name',$value); //在 Action 类里面使用 assign 方法对模板变量赋值,无论 ...

随机推荐

  1. sql 字符串末尾空格不占长度

    print len('qwer ');--4 print len('qwer                            ');--4 print len('qwer ' + 't');-- ...

  2. python:包含’e’和‘-’的 str 转 float

    from functools import reduce def str2float(s): s = s.split('.') a = s[0] b = s[1] if a[0] == '-': a ...

  3. 解决黑苹果macOS Monterey系统无法正常睡眠、睡眠无法唤醒,唤醒后显示器无输出问题

    1.解决无法睡眠问题:添加睡眠补丁:HibernationFixup.kext, 或者添加ssdt:ssdt-GPRW.aml,并在ACPI补丁中添加热补丁: 2.解决睡眠后无法唤醒.唤醒后显示器无输 ...

  4. Oracle学习-----基本SQL select语句

    一.基本select语句 SELECT 标识  选择那些列 FROM     标识从哪个表中选择 select * 标识 全部选择 select department_id, location_id ...

  5. C语言初级阶段7——指针4

    C语言初级阶段7--指针4 结构体指针 1.概念:所谓的结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针.如果把一个结构体变量的其实地址存放在一个指针变量中,那么这 ...

  6. Linux系统环境下部署jar程序实现后台运行1

    [ nohup java -jar xxx.jar --spring.profiles.active=prod > 日志文件名 2>&1 & ]

  7. 按list大小进行分组

    package cn.tk.netcore.rest;import java.util.ArrayList;import java.util.Arrays;import java.util.List; ...

  8. 8.Vuex状态管理

    一.Vuex 概述 1.1 组件之间共享数据的方式 父传子: v-bind 属性绑定 子传父: v-on 事件绑定 兄弟组件之间共享数据: EventBus $on 接收数据的那个组件 (数据接收方) ...

  9. Unity_飞机大战记录总结

    记录步骤:win+R→PSR.exe 一.竖屏设置 分辨率设为9:16 二.主控脚本 添加一个空节点,命名"游戏主控" 新建游戏的主控脚本,命名为MyGame.cs,方便管理(即, ...

  10. 转发:前端组件化之Monorepo方案实战

    前言 在上一篇的前端组件化方案探究中,我们研究了什么是组件化以及我们为什么需要组件化.也调研和测试了一些开源项目,并且在使用.学习.研究.对比之后最终确定了以 pnpm + workspace + c ...