Flask-Login为Flask提供了用户会话管理,它处理了日常的登入登出且长时间记住用户的会话

使用:

1、配置,初始化 LoginManager

  创建实例

  loginManger = LoginManager()

  绑定到核心app

  loginManager.init_app(app)

2、我们的User Model需要需要实现下面这些属性和方法:

  is_authenticated:用户通过验证时,会返回True(只有通过验证的用户会满足login_required的条件)

  is_active:账户处于激活状态的情况下,会返回True

  is_anonymous:是否是匿名用户,是就返回True,真是用户返回False

  get_id():返回一个唯一识别用户的id

  flask-login的UserMixin已经都实现了这些属性和方法,所以我们在定义我们的User Model的时候,直接继承UserMixin即可。

3、用户的用户名密码验证通过之后,我们可以使用login_user(user)来使用户登录

   它会创建一个token,写到浏览器的cookie中

   然后在我们访问任何页面时,flask-login会检查是否登录,没有登录的话,会跳转到登录页

  

  登录成功,会重定向到我们指定的页面,这里,我们还需要注意,一定要做重定向地址验证,否则很容易就受到重定向攻击:

    如我们在login的时候输入如下url:http://127.0.0.1:5000/login?next=http://www.baidu.com

    那么在登录成功后,就会直接跳转到百度界面

4、user_loader的使用

  我们必须要提供这个user_loader的回调函数,它用户通过会话中的sessionid重新加载用户对象。

  

  1、在login_user内部,我们将user的属性写入到session中,session["user_id"] = user.id,并将user绑定到请求上下文

  2、用户发起一次http请求的时候,如果ctx.user无值,会通过某个callback查询当前登录的用户,这个callback的参数就是user_id,即session["user_id"]

  3、loginManager.user_loader就是注册这个callback

  4、此回调函数,其实就是用来记录用户的登录状态的。

5、下面看看整个登录过程:

  1)首先前端用户post过来用户名密码,我们在View中接收并验证正确后,会调用login_user执行登录,并将token写入到前端cookie中

    我们去函数内部看看login_user的源码,这里它将用户信息user_id 写入到了session["user_id"]中,并将user绑定到请求上下文中。

  由于http是无状态连接,每次发起新的请求时,flask会创建一个新的请求上下文,在分发路由时,flask-login根据cookie判断用户并绑定的请求上下文,由于这种绑定关系的存在,新的请求发生时,都需要获取user。

  (flask-login--->util.py)

  

  

  再看我们的reload_user(login_manager.py),首先会从session中获取user_id,如果user_id存在,通过参数user_id去调用回调函数,也就是我们通过loginManager.user_loader绑定的回调函数,去查找当前登录的user,并将其绑定到当前的请求上下文

  绑定的意义就在于每次当我们使用current_user的时候,会直接从当前上下文中返回。

  如果当前session中没有user_id,那么会认为当前没有登录,会返回None

  

6、上面几步都走完了,我们就登录成功了。

7、验证

  对于需要用户登录才能执行的,可以在视图函数上加上装饰器 login_required

  默认情况下,当未登录用户访问一个login_required装饰器装饰的视图时,Flask-Login会闪现一条消息并重定向到一个登录视图

  app.router("/setting")

  @login_required

  def settings():

    pass

8、登出

  当用户要登出时

  app.router("/logout")

  @login_required

  def logout():

    logout_user()

    return redirect("")

  此时会登出,且原先登录的各种会话的cookie都会被清除。

9、自定义未授权登录

  如果未登入用户访问了login_required装饰的视图函数,Flask-Login默认会给我们返回401 unauthorized

  

  

  从源码中我们可以看到,其实我们是可以自定义当用户无权限访问时的处理的:

  1)我们可以自定义login_view

   loginManager.login_view = "web.login"

   loginManager.login_message = "please login first"

  2)我们可以重写unauthorized_callback函数,使用unauthorized_handler装饰

    

10、前面使用的是user_loader来检查登录,它是通过使用cookie携带登录的token来完成登录,那如果我们不想使用cookie的方式来完成登录呢,比如使用HTTP头,或者一个作为查询参数的api秘钥?

  这种情况下,我们应该使用Request Loader回调来定制登录检查,request loader接受的是Flask请求request,不再是user_id

  

11、记住我

  默认情况下,当用户关闭浏览器的时候,当前会话的cookie就会被删除。但是我们在使用浏览器的时候,经常会看到“记住我” 的操作,记住我可以防止用户在关闭浏览器时意外退出。

  这并不意味着用户注销后记住或预先填写登录表单中的用户名和密码。

  在flask-login中,这项看似很复杂的功能,使用起来很简单,只需要将remember=True传递给login_user即可。

  cookie将被保存在用户的计算机上,如果不在会话中,Flask-login将自动从该cookie中恢复用户ID,cookie到期前的时间可以通过 REMEMBER_COOKIE_DURATION配置进行设置,也可以通过login_user进行设置。

12、通过token认证

  使用token来替代存放用户信息到session中,这样具有更多的灵活性

  @login_manager.user_loader

  def load_user(session_token):

    return User.query.filter_by(session_token = session_token).first()

  如果使用token来验证,需要改变user的get_id方法:

    def get_id(self):

      return unicode(self.session_token)

  这样用户在修改密码的时候,可以自由的将会用的会话标识更新为新的随机字符串,旧的认证会话将不再有效。token必须唯一。

13、刷新登录

  

  

flask登录插件 flask-login的更多相关文章

  1. flask登录注册简单的例子

    1.主程序 # app.py # Auther: hhh5460 # Time: 2018/10/05 # Address: DongGuan YueHua from functools import ...

  2. flask登录功能实现的思路

    flask登录实现过程思路:前端创建表单,post方法,userno,pwd参数 后端首先创建登录验证函数check(验证函数是指通过request.get来获取前端的userno,pwd.然后将两个 ...

  3. python 全栈开发,Day142(flask标准目录结构, flask使用SQLAlchemy,flask离线脚本,flask多app应用,flask-script,flask-migrate,pipreqs)

    昨日内容回顾 1. 简述flask上下文管理 - threading.local - 偏函数 - 栈 2. 原生SQL和ORM有什么优缺点? 开发效率: ORM > 原生SQL 执行效率: 原生 ...

  4. [Python自学] Flask框架 (1) (Flask介绍、配置、Session、路由、请求和响应、Jinjia2模板语言、视图装饰器)

    oldboy:s9day114 参考博客:https://www.cnblogs.com/wupeiqi/articles/7552008.html 一.Flask简介 1.安装Flask pip i ...

  5. ECshop 快捷登录插件 支持QQ 支付宝 微博

    亲自测试可以使用,分享给大家.(承接各种EcShop改版,二次开发等相关项目 QQ:377898650) 安装的时候按照里面说明.安装即可. 代码下载:http://pan.baidu.com/s/1 ...

  6. nopCommerce 3.9 大波浪系列 之 微信公众平台登录插件

    一.简介 插件源码下载:点击下载 微信公众平台网站授权帮助地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp142114084 ...

  7. nopCommerce 3.9 大波浪系列 之 外部授权登录插件的开发实现

    一.简介 nop支持第三方外部授权登录的扩展,本篇通过编写微信公众平台登录插件进一步了解nop授权登录的开发过程. 微信公众平台.微信开放平台使用场景不一样,前者通过微信客户端进行开发如公众号,后者基 ...

  8. flask第一章 flask启动 路由视图 FlaskRequest jinja2 FlaskSession

    一.简单了解flask web框架 优点: 小而精,组件只有session,第三方机构强烈支持flask,极其简单 缺点: 由于第三方软件的关系,稳定性相对较差,flask-session 扩展知识: ...

  9. Flask系列(二)Flask基础

    知识点回顾 1.flask依赖wsgi,实现wsgi的模块:wsgiref(django),werkzeug(flask),uwsgi(上线) 2.实例化Flask对象,里面是有参数的 app = F ...

随机推荐

  1. 扫码下单使用FAQ

    1.适用情景:扫码点餐支付宝支付报错 解决方案:1.检查主账号上口碑授权是否失效.(重新授权) 2.检查主账号上的PID是否绑定.(绑定PID) 注意:1.支付宝扫码进行的扫码下单支持直连支付宝和蚂蚁 ...

  2. 洗礼灵魂,修炼python(69)--爬虫篇—番外篇之feedparser模块

    feedparser模块 1.简介 feedparser是一个Python的Feed解析库,可以处理RSS ,CDF,Atom .使用它我们可从任何 RSS 或 Atom 订阅源得到标题.链接和文章的 ...

  3. python数据类型分类以及运算类型

    一.python数据类型 目录: 1.数字(整数.小数) 2.字符串(单引号.双引号.三引号) 3.元组 #元素确定之后不能修改 4.列表 #元素可以修改 5.集合  #不讲顺序,得到的结果没有重复元 ...

  4. C++实现第三方资源释放与载入过程(以DLL为例)

    简介 我们经常看见有一些程序开始执行时会释放一些文件,以便于后续操作.例如一些病毒为了便于传播和隐藏,经常把一些需要用的动态库或是驱动文件打包进一个可执行文件中,再由需要使用的时候,再临时释放和加载. ...

  5. February 11th, 2018 Week 7th Sunday

    Grasp all, lose all. 欲尽得,必尽失. Not to be greedy and not to try to get everything. Our time, energy an ...

  6. 【夯实Ruby基础】Ruby快速入门

    本文地址: http://www.cnblogs.com/aiweixiao/p/6664301.html 文档提纲 扫描关注微信公众号 1.Ruby安装 1.1)[安装Ruby] Linux/Uni ...

  7. 【夯实PHP基础】PHPUnit -- PHP测试框架

    本文地址 分享提纲: 1.概述 2.安装 3.编写第一个测试用例 4.PHPUnit高级 5.参考 1.概述 1)[测试框架] 它是一款轻量级的PHP测试框架,是一个xUnit的体系结构的单元测试框架 ...

  8. MySQL高级知识(五)——索引分析

    前言:前面已经学习了explain(执行计划)的相关知识,这里利用explain对索引进行优化分析. 0.准备 首先创建三张表:tb_emp(职工表).tb_dept(部门表)和tb_desc(描述表 ...

  9. 【BZOJ1449】 球队收益

    BZOJ1449 球队收益 Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 10 1 0 1 3 3 1 2 2 3 3 1 Sa ...

  10. C#のsocket通信

    博主要做一个手机和电脑端(C#)通讯的程序,便览了网络上关乎socket的东西.但是接收文件的时候卡住了,怎么也接收不全.后来做了分片处理,如果分片,发送的时候就会有不同的socket(客户端开发不是 ...