看外国文献的中文翻译  翻译的程度有的让人会疯,翻译最好的状态是异译 直译会显的很生硬 看起来确实难过;所以在看的时候,建议都看外国文献吧,或者自己用谷歌翻译,感觉比一些翻译的博客准多了;

在使用flask_login 之前,至少要了解flask怎么使用,设置配置启动

1,安装flask_login

pip install flask_login

2,在flask项目中配置flask_login

login_manager = LoginManager()
app.config[‘SECRET_KEY‘]=‘‘ #随意设置
login_manager.init_app(app)

3,设置session及其验证

1)提供user_loader的回调函数,主要是通过获取user对象存储到session中,自己实现最好启用缓存

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

2)你的自定义的user类需要提供以下几个属性:

  1.1  is_authenticated

   属性,用来判断是否是已经授权了,如果通过授权就会返回true

  1.2 is_active

   属性,判断是否已经激活

  1.3 is_anonymous

  属性,判断是否是匿名用户

  1.4 get_id()

  方法,返回用户的唯一标识

这些属性和方法也可以直接继承于userMixin的默认方法和属性,不用自己去实现;

class User(UserMixin,db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(), unique=True, nullable=False)
email = db.Column(db.String(), unique=True, nullable=False)
password= db.Column(db.String())
avatar_hash = db.Column(db.String()) def __init__(self,id,username,email):
self.id = id
self.username = username
self.email = email def __repr__(self):
return '<User %r>' % self.username

4,登陆实操例子

4.1 登陆操作

@app.route('/login', methods=['GET', 'POST'])
def login():
# Here we use a class of some kind to represent and validate our
# client-side form data. For example, WTForms is a library that will
# handle this for us, and we use a custom LoginForm to validate.
form = LoginForm()
if form.validate_on_submit():
# Login and validate the user.
# user should be an instance of your `User` class
login_user(user)
flask.flash('Logged in successfully.') next = flask.request.args.get('next')
# is_safe_url should check if the url is safe for redirects.
# See http://flask.pocoo.org/snippets/62/ for an example.
if not is_safe_url(next):
return flask.abort() return flask.redirect(next or flask.url_for('index'))
return flask.render_template('login.html', form=form)

这里的是登陆的请求操作,通过用户查询,判断是否有权限,然后通过login_user(user),其实也是调用user_loads()把用户设置到session中

这里的next参数可能有安全问题而不能直接跳转,可以考虑使用is_safe_url去过滤

4.2  登陆后的用户,默认提供了current_user的用户代理方法,可以在视图中直接使用:

{% if current_user.is_authenticated %}
Hi {{ current_user.name }}!
{% endif %}

4.3 判断是否登陆,有权限要求,通过@login_required 来装饰

@app.route("/settings")
@login_required
def settings():
pass

4.4 退出登陆,这样会清除cookie和session

@app.route("/logout")
@login_required
def logout():
logout_user()
return redirect(somewhere)

例子到此结束,接下来总结一些自定义的方法:

5,自定义登陆操作

5.1 未登陆的用户访问了@login_required视图的操作,可以设置一些默认的操作,否则可能直接报401的错误
  1) 设置登陆视图,用于未授权操作的跳转:

login_manager.login_view = “users.login”

  2) 设置快闪消息,用于提示用户:

login_manager.login_message = u"Bonvolu ensaluti por uzi tiun paĝon."

  3) 设置未登录跳转可以携带消息的路径

login_manager.login_message_category = "info"

好像有点晦涩难懂,也就是在登陆页面的重定向时候,可以携带到登陆请求的参数,例如在一个用户页面,session过期,这是要跳转到登陆页面,那么会把当前的链接当参数存放到next里面传递到登陆请求中。当然了,这里还可以设置USE_SESSION_FOR_NEXT =True 这样就把链接放session里面了;而这些可携带参数链接必须在info的路径下。
  4) 自己定义未登录的处理引擎

@login_manager.unauthorized_handler
def unauthorized():
# do stuff
return a_response

6,定义客户端登陆
有时候你想要不使用cookies来登录用户,比如使用头部值或者作为查询参数传递的api键值。 在这些情况下,您应该使用request_loader回调。 这个回调应该和你的user_loader回调一样,只是它接受Flask请求而不是user_id。
举个例子,你可以通过路径的参数或者请求头里携带的Authorzation消息进行验证用户:

@login_manager.request_loader
def load_user_from_request(request):   # first, try to login using the api_key url arg
  api_key = request.args.get('api_key')
  if api_key:
  user = User.query.filter_by(api_key=api_key).first()
  if user:
  return user # next, try to login using Basic Auth
  api_key = request.headers.get('Authorization')
  if api_key:
  api_key = api_key.replace('Basic ', '', )
  try:
  api_key = base64.b64decode(api_key)
  except TypeError:
  pass
  user = User.query.filter_by(api_key=api_key).first()
  if user:
  return user # finally, return None if both methods did not login the user
  return None

7,匿名用户
默认是指没有登陆的用户,会设置一个AnonymousUserMixin对象到current_user里面,他有如下的属性和方法:
  is_active and is_authenticated are False
  is_anonymous is True
  get_id() returns None
如果你的系统要求需要记住匿名用户的一些操作,你可以设置处理引擎(方法或者类),然后注册到login_manager:

login_manager.anonymous_user = MyAnonymousUser

8,记住我操作
默认情况下,当用户关闭浏览器时,Flask会话被删除,用户注销。 “记住我”可以防止用户在关闭浏览器时意外退出。这并不意味着在用户注销后记住或预先填写登录表单中的用户名或密码。

“记住我”功能可能会很难实现。但是,Flask-Login使它几乎是透明的 - 只需将remember = True传递给login_user调用即可。 Cookie将被保存在用户的计算机上,然后如果不在会话中,Flask-Login将自动从该Cookie恢复用户ID。 cookie到期前的时间可以通过REMEMBER_COOKIE_DURATION配置进行设置,也可以通过login_user进行设置。 cookie是防篡改的,所以如果用户篡改它(即插入别人的用户ID代替他们自己的),cookie将仅仅被拒绝,就好像它不在那里一样。

这一级别的功能是自动处理的。但是,如果您的应用程序处理任何类型的敏感数据,您可以(也应该可以)提供额外的基础结构来提高记忆Cookie的安全性。

9,可选的令牌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)

这样,当用户更改密码时,您可以自由地将用户的会话标记更改为新的随机生成的值,这将确保其旧认证会话将不再有效。 请注意,会话令牌仍然必须唯一标识用户,可将其视为第二个用户标识。

10,刷新登陆
适用某些特殊的场景吧!例如你修改了用户的密码或者个人信息之后,是不是很多平台都会要求你重新登陆,这里就设计session的清除然后重新加载等的问题。
刷新登陆也不难,跟设置未授权的跳转是差不多的:
   10.1 配置参数

login_manager.refresh_view = "accounts.reauthenticate"
login_manager.needs_refresh_message = (
u"To protect your account, please reauthenticate to access this page."
)
login_manager.needs_refresh_message_category = "info"

也是配置刷新后跳转的视图,提示信息,可传递参数路径
   10.2 自定义处理引擎:

@login_manager.needs_refresh_handler
def refresh():
  # do stuff
  return a_response

然后再需要刷新的方法里调用confirm_login()函数,具体可查看API
   10.3 cookie 的细节可以在应用设置中定义。
  REMEMBER_COOKIE_NAME 存储“记住我”信息的 cookie 名。 默认值: remember_token
  REMEMBER_COOKIE_DURATION cookie 过期时间,为一个 datetime.timedelta 对象。 默认值: 365 天 (1 非闰阳历年)
  REMEMBER_COOKIE_DOMAIN 如果“记住我” cookie 应跨域,在此处设置域名值 (即 .example.com 会允许 example 下所有子域 名)。 默认值: None
  REMEMBER_COOKIE_PATH 限制”记住我“ cookie 存储到某一路径下。 默认值: /
  REMEMBER_COOKIE_SECURE 限制 “Remember Me” cookie 在某些安全通道下有用 (典型地 HTTPS)。默认值: None

  REMEMBER_COOKIE_HTTPONLY 保护 “Remember Me” cookie 不能通过客户端脚本访问。 默认值: False

11 会话保护
当上述特性保护“记住我”令牌免遭 cookie 窃取时,会话 cookie 仍然是脆弱的。 Flask-Login 包含了会话保护来帮助阻止用户会话被盗用。

你可以在 LoginManager 上和应用配置中配置会话保护。如果它被启用,它可以在 basic 或 strong 两种模式中运行。要在 LoginManager 上设置它,设置 session_protection 属性为 "basic" 或 "strong":

login_manager.session_protection = "strong"

或者,禁用它:

login_manager.session_protection = None

默认,它被激活为 "basic" 模式。它可以在应用配置中设定 SESSION_PROTECTION 为 None 、 "basic" 或 "strong" 来禁用。

当启用了会话保护,每个请求,它生成一个用户电脑的标识(基本上是 IP 地址和 User Agent 的 MD5 hash 值)。如果会话不包含相关的标识,则存储生成的。如果存在标识,则匹配生成的,之后请求可用。

在 basic 模式下或会话是永久的,如果该标识未匹配,会话会简单地被标记为非活 跃的,且任何需要活跃登入的东西会强制用户重新验证。(当然,你必须已经使用了活跃登入机制才能奏效。)

在 strong 模式下的非永久会话,如果该标识未匹配,整个会话(记住的令牌如果存在,则同样)被删除。

12  本地化
默认情况下,当用户需要登录,LoginManager 使用 flash 来显示信息。这些信息都是英文的。如果你需要本地化,设置 LoginManager 的 localize_callback 属性为一个函数,该函数在消息被发送到 flash 的时候被调用,比如,gettext。

参考:

外文:https://flask-login.readthedocs.io/en/latest/#flask_login.confirm_login

中文:http://www.pythondoc.com/flask-login/index.html#authorization-header

flask-login使用笔记的更多相关文章

  1. Flask admin Flask login 整合模板

    项目地址: https://github.com/WES6/supflask Flask admin 官方文档: https://flask-admin.readthedocs.io/en/lates ...

  2. 知了课堂 Python Flask零基础 笔记整理

    目录 起步 安装Python2.7: Python虚拟环境介绍与安装: pip安装flask: 认识url: URL详解 web服务器和应用服务器以及web应用框架: Flask 第一个flask程序 ...

  3. 【Python】Flask系列-模板笔记

    Jinja2模板 Jinja2模板传参 如何渲染模板: 模板放在templates文件夹下 从flask中导入render_template函数. 在视图函数中,使用render_template函数 ...

  4. Web开发Flask框架学习笔记

    Python 是一种跨平台的[计算机程序设计语言],是一种面向对象的动态类型语言,Python是纯粹的自由软件,源代码和解释器CPython遵循 GPL(GNU General Public Lice ...

  5. 【Flask】学习笔记(一)入门

    Flask 入门基础 Flask是一个轻量级的后台框架,用Flask作为Web框架的公司有Netfix,Reddit等,国内豆瓣,果壳等.使用flask的公司列表.Flask 有主要的两个依赖,一个是 ...

  6. Flask框架学习笔记(API接口管理平台 V1.0)

    今天博主终于完成了API接口管理平台,最后差的就是数据库的维护, 博主这里介绍下平台的设计原理,首先基于python,利用flask的web框架+bootstrap前端框架完成,先阶段完成了前台展示页 ...

  7. 【Python】Flask系列-数据库笔记

    MySQL-python中间件的介绍与安装: 1.如果是在类unix系统上,直接进入虚拟环境,输入sudo pip install mysql-python. 2.如果是在windows系统上,那么在 ...

  8. Flask 源代码阅读笔记

    我认为我已经养成了一个坏习惯.在使用一个框架过程中对它的内部原理非常感兴趣,有时候须要花不少精力才 明确,这也导致了学习的缓慢,但换来的是对框架的内部机理的熟悉,正如侯捷所说,源代码面前,了无秘密.这 ...

  9. Python Flask 开发学习笔记

    Flask学习 安装pipenv虚拟环境 pip Install pipenv 运行pipenv pipenv --version 进入虚拟容器 pipenv install 安装flask pipe ...

  10. Flask框架学习笔记(API接口管理平台 V2.0)

    博主今天把API接口管理平台发布到github了,这次是更新一些功能 如支持本地数据库sqlite3.优化了数据结构 技术方面跟之前V1.0相同,只增加生产本地数据:但是为了支持层级的参数,修改了数据 ...

随机推荐

  1. java注解(Annotation)

    本文转载自http://www.cnblogs.com/xdp-gacl/p/3622275.html 一.认识注解 注解(Annotation)很重要,未来的开发模式都是基于注解的,JPA是基于注解 ...

  2. Linux系列教程(十五)——Linux用户和用户组管理之用户管理命令

    上篇博客我们介绍了用户管理的相关配置文件,包括用户信息文件/etc/passwd,用户密码文件/etc/shadow:然后介绍了用户组信息文件/etc/group,用户组密码文件/etc/gshado ...

  3. [java基础] java中的自动装箱与自动拆箱

    自动装箱的一个例子: Integer i = 1; //实际上是执行了Integer i = Integer.valueOf(1) 自动拆箱的一个例子: Integer a =1; int b = a ...

  4. vue 集成 axios 发送post请求 payload导致后台无法接收到数据问题

    vue 集成axios之后,发送的post请求默认为payload 方式. 如果想改为正常的方式,需要增加headers头,并且将发送是数据json格式改为 querystring的方式. 安装依赖 ...

  5. windows下 sbulime text 安装less2css踩的几个坑

    sublime 就不介绍了,less2css 是一个安装在sublime上的插件,可以让你书写less后自动生成css文件,而且还可以提示less的语法错误. 搜了一下相关的教程,很多都写的不全,按照 ...

  6. CopyOnWriteArrayList并发容器

    CopyOnWriteArrayList并发容器 Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才 ...

  7. js滚动加载小插件

    本文实例讲述了jquery滚动加载数据的方法.分享给大家供大家参考.具体分析如下: 少废话直接上代码!!!粗暴,直接,干脆 0//lk-2017-05-04 1(function($, win) { ...

  8. CLR类型设计之方法与构造器

    无论学习那门语言都要学习函数体,C#,JAVA,PHP,都会涉及到函数体,而C#的函数体成员并不少,方法和构造器就是函数体成员之一,函数体成员还包括但不限于:方法,属性,构造器,终结器,运算符及索引器 ...

  9. 前端面试题系列(1):doctype作用 标准模式与兼容模式

    1.doctype作用 <!DOCTYPE>声明位于HTML文档的第一行.处于<HTML>标签之前.告知浏览器的解析器用什么文档标准解析这个文档.DOCYTYPE不存在或格式不 ...

  10. FPGA DDR3调试

    FPGA DDR3调试 Spartan6 FPGA芯片中集成了MCB硬核,它可以支持到DDR3.在Xilinx的开发工具Xilinx ISE中提供了MIG IP核,设计者可以用它来直接生成 DDR3 ...