HTTP 协议是无状态的,无法记录用户的访问状态,但是在Web应用中我们需要知道用户的状态,尤其是用户登录的状态,这样在页面跳转后,才知道用户是否有权限来操作页面上提供的功能或是查看页面上的数据。Flask-Login为Flask应用提供了用户session的管理机制,可以很好地帮我们维护和管理用户的登录状态。
可以利用pip进行安装
pip install flask-login
在__init__.py
文件中,实例化Flask-Login的对象:
from flask_login import LoginManager
#用户认证
login_manger=LoginManager()
…
#配置用户认证信息
login_manger.init_app(app)
#认证加密程度
login_manger.session_protection='strong'
#登陆认证的处理视图
login_manger.login_view='auth.login'
#登陆提示信息
login_manger.login_message=u'对不起,您还没有登录'
login_manger.login_message_category='info'
(1)使用Flask_Login需要使要验证的实体对象(models.py中的Users对象)继承自UserMixin类:
from flask_login import UserMixin
#用户表
class Users(db.Model,UserMixin):
__tablename__='users'
id=db.Column(db.Integer,primary_key=True)
username=db.Column(db.String(20),nullable=False,index=True)
password=db.Column(db.String(255), nullable=False,index=True)
phone=db.Column(db.String(32),nullable=False)
email=db.Column(db.String(50),nullable=False)
(2)Flask-Login要求程序实现一个回调函数,使用指定的标识符加载用户。我们可以在models.py文件中进行定义:
#用户认证的回调函数
from app import login_manger
@login_manger.user_loader
def load_user(user_id):
return Users.query.get(int(user_id))
该函数接收以Unicode编码方式表示的用户标识。如果能够找到该用户,就返回该用户的Users对象,否则返回None。
(3)如果需要让页面只允许认证用户访问,可使用login_required装饰路由函数,未登录的请求将会跳转到上面loginManager.login_view
设置的登录页面路由:
@auth.route('/logout/')
@login_required
def logout():
#用户登出
logout_user()
flash(u'用户已经登出')
return redirect(url_for('auth.login'))
如果未登录(认证)的用户尝试访问该页面,Flask-Login就会拦截该请求,病重定向到loginManager.login_view
设置的登陆页面中去。
(4)在登录登出的过程中,需要添加如下代码:
登录:
from flask_login import login_required,logout_user,login_user
…
#记录用户的登录状态
login_user(user,form.remeber_me.data)
登出:
#用户登出
logout_user()
login_user函数的第一个参数是需要登录的用户对象,第二个参数是bool值,如果为False,那么关闭浏览器后用户会话就会中断,下次用户访问时需要重新登录。如果为True,那么会在浏览器中写入一个长期有效的cookie,使用该cookie可以复原用户会话。
(5)获取当前登录用户对象
from flask_login import current_user
…
@auth.route('/unconfirmed/')
def unconfirmed():
if current_user.is_anonymous:
return redirect(url_for('main.index'))
return render_template('auth/unconfirmed.html')
current_user记录了当前登录(认证)用户的信息,提供了一个访问和表示当前登录的对象。比如可以在模板中根据用户登录状态,显示不同的内容:
{% if current_user.is_authenticated%}
<li><a href="#">{{current_user.username}}a>li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
账号管理
<span class="caret">span>
a>
<ul class="dropdown-menu">
<li><a href="{{url_for('auth.change_pwd')}}">修改密码a>li>
<li><a href="#">重置密码a>li>
<li><a href="#">修改邮箱地址a>li>
ul>
li>
<li><a href="{{url_for('auth.logout')}}">登出a>li>
{%else%}
<li><a href="{{url_for('auth.register')}}">注册a>li>
<li><a href="{{url_for('auth.login')}}">登录a>li>
{%endif%}
Flask-Login提供了一个非常有用的用户登录状态维护功能,让我们可以为不同的用户设定特定的权限和功能,是Flask框架中一个非常关键的插件。