flask-login模块
flask-login为flask提供了用户会话管理。他处理了日常的登入,登出并且长时间记住用户的会话。
1.在会话中存储当前活跃的用户ID,让你能够自由地登入和登出。
2.让你限制登入或登出用户可以访问的视图。
3.处理让人棘手的记住我功能。
4.帮助你保护用户会话免遭cookie被盗的牵连。
5.可以与以后可能使用的flask-principal或其他认证扩展集成。
一、配置你的应用
对一个使用flask-login的应用最重要的一部分是loginmanager类。
login_manager = LoginManager()
login_manager.init_app(app)
二、他是如何工作的
必须提供一个user_loader回调。
@login_manager.user_loader
def load_user(userid):
return User.get(userid)
接受一个用户的unicodeID作为参数,并且返回响应的用户对象。
如果ID无效的话,他应该返回none。
三、你的用户类
你用来标识用户的类需要实现这些属性和方法:
四个方法:
is_authenticated、is_active、is_anonymous、get_id
is_authenticated 当用户通过验证时,也即提供有效证明是返回true。
is_active 可以直接返回true。
is_anonymous 如果是匿名用户,返回true。真实用户返回False。
get_id 返回一个能唯一识别用户的,并能用于user_loader回调中加载用户的Unicode ID。
要简便的实现用户类,可以从UserMixin继承,他提供了对所有这些方法的默认实现。
四、login示例
一旦用户通过验证,使用login_user函数让用户登录。
@app.route('/login',methods=['GET','POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
login_user(user)
flask.flash('Logged in successfully.')
next = flask.request.args.get('next')
if not next_is_valid(next):
return flask.abort(400)
return flask.redirct(next or flask.url_for('index'))
return flask.render_template('login.html', form=form)
这里必须验证next参数,如果不验证,你的应用会收到重定向攻击。
需要用户登入的视图可以用login_required装饰器来装饰。
@app.route('/settings')
@login_required
def settings():
pass
当用户需要登出时,使用logout_user方法。
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(somewhere)
他们会被登出,且他们会话产生的任何cookie都会被清理干净。
五、定制登入过程
默认情况下,当未登录的用户尝试访问一个login_required装饰的视图,flask-login会闪现
一条消息并且重定向到登录视图。
如果未设置登录视图,他将会以401错误退出。
登录视图的名称可以设置成LoginManager.login_view。
login_manager.login_view = 'users.login'
默认的闪现消息是Please log in to access this page.
要自定义该信息,请设置login_message。
login_manager.login_message = u'please log in'
要自定义消息分类,请设置login_message_category。
login_manager.login_message_category = 'info'
当重定向到登入视图,他的请求字符串中会有一个next变量,其值为用户之前访问的页面。
六、使用request loader定制登录
有时你想要不使用cookies情况下登录用户,比如使用http头或者一个作为查询参数的api密钥。
这种情况下应该是用request_loader回调。
七、匿名用户
默认情况下,当一个用户没有真正的登录,current_user被设置成一个AnonymousUserMixin对象。
is_active is_authenticated的值为False
is_anonymous的值为true
get_id返回None
八、记住我
记住我的功能很难实现。但是flask-login几乎透明的实现它。
只要把remember=True传递给login_user。
一个cookie将会存储在用户计算机中,如果用户会话中没有用户ID的话,flask-login会自动地从cookie中恢复用户ID。
这里cookie是防篡改的。
该层功能是被自动实现的。
九、会话保护
当上述特性保护记住我令牌免遭cookie窃取时,会话cookie依然是脆弱的。
session_protection的值为basic或者strong。禁用时应设置为None。
默认时被激活为basic模式。
这里需要知道字符串或者数字如何转换为Unicode。非常重要。
计划在下一篇博客中讨论。
flask-login模块的更多相关文章
- Flask admin Flask login 整合模板
项目地址: https://github.com/WES6/supflask Flask admin 官方文档: https://flask-admin.readthedocs.io/en/lates ...
- flask request模块
原文链接: https://blog.csdn.net/u012163234/article/details/53116652 前言 在进行Flask开发中,前端需要发送不同的请求及各种带参数的 ...
- [flask]flask_login模块,session及其他
读flask源码的时候,有一点一直到现在都没有一个清晰的概念,比如四个全局变量g,current_app,session,request是怎么做到的 按照查到的资料里面的说法,为了不至于每次都主动调用 ...
- @locked_cached_property ---flask.helpers模块
源码: class locked_cached_property(object): """A decorator that converts a function int ...
- Django中authenticate和login模块
Django 提供内置的视图(view)函数用于处理登录和退出,Django提供两个函数来执行django.contrib.auth中的动作 : authenticate()和login(). 认证给 ...
- Flask+gevent-websocket模块实现websocket
后端代码: from flask import Flask,request from geventwebsocket.handler import WebSocketHandler from geve ...
- login 模块,re 模块
标准三流 标准输入流:sys. stdin # input的底层 标准输出流:sys. stdout # print的底层 标准错误流:sys. stderr # 异常及loggin ...
- Flask-Login详解
Flask-Login详解 关于Flask登录认证的详细过程请参见拙作<<使用Flask实现用户登陆认证的详细过程>>一文,而本文则偏重于详细介绍Flask-Login的原理, ...
- 解决centos6系统上python3—flask模块的安装问题
Flask 是一个使用 Python 编写的轻量级 Web 框架(所以我们前面花了那么多时间安装 Python3 呀).它被称为微型架构,因为其使用非常简单的核心以及功能丰富的扩展.虽然 Flask ...
- Flask基础全套
Flask简介 Flask是主流PythonWeb三大框架之一,其特点是短小精悍以及功能强大从而获得众多Pythoner的追捧,相比于Django它更加简单更易上手,Flask拥有非常强大的三方库,提 ...
随机推荐
- mysql GROUP_CONCAT 查询某个字段(查询结果默认逗号拼接)
Mysql 的 GROUP_CONCAT 函数默认将查询的结果用逗号拼接并返回一个字符串,如:李四,long,张三 1. 常用方式 select GROUP_CONCAT(user_name) use ...
- 洛谷P4778 Counting swaps 数论
正解:数论 解题报告: 传送门! 首先考虑最终的状态是固定的,所以可以知道初始状态的每个数要去哪个地方,就可以考虑给每个数$a$连一条边,指向一个数$b$,表示$a$最后要移至$b$所在的位置 显然每 ...
- Java安装及基础01
Java特性: (1)java语言是面向对象的语言 (2)编译一次,到处运行(跨平台) (3)高性能 配置环境变量: JAVA命名规则: (1)常量命名规则:每个字母都大写(POEPLE_PRE_NO ...
- win7 64位系统下安装autoitlibrary库遇到问题解决
转载来自http://blog.sina.com.cn/s/blog_53f023270101skyq.html 今天需要在win7 64位系统下安装autoitlibrary库,起初安装好了robo ...
- 冒泡排序(JAVA实现)
基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒. 即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将 ...
- ADB——adb devices unauthorized
我们只有在手机打开USB调试,并且允许电脑对其进行调试的前提下才可以用ADB进行自动化操作手机,如果出现unauthorized提示的话就是说明手机没有允许电脑对其调试 这个时候通常手机回弹出允许调试 ...
- Oracle 11g R2性能优化 tkprof
另一篇博文总结了关于SQL TRACE工具的使用方式,但是产生的trace文件格式阅读起来并不是十分友好,为了更好的分析trace文件,Oracle也自带了一个格式化工具tkprof.tkprof工具 ...
- VS2017 异常 Editor or Editor Extension
KE遇到的第一个问题 VS 2017 打开文件的时候, 遇到异常 检查 activity_log发现是 Editor or Editor Extension, 解决办法: 安装插件, Clear ME ...
- Git使用之pull request
一直对git的使用都不熟,由于工作需要经常需要在github上pull request,第一次还是有些麻烦的,写个笔记记录下 1. fork源项目到自己的github仓库中 fork之后自己也会多出一 ...
- php----------linux下安装php的swoole扩展
1.首先你已经安装好了php环境,这里就不介绍php环境的安装了.如果你是编译安装记得将php加入环境变量,以便于方便查看扩展是否安装成功. 2.我安装的php环境缺少了要给东西,详细看下图 如果你没 ...