原文地址:https://blog.csdn.net/hyman_c/article/details/53890450一、flask_login的安装

        本文主要介绍使用flask_login管理用户的登录和登出。flask_login的安装:


pip install flask-login


二、User模型继承UserMixin


       使用flask_login进行用户的登录和登出管理,需要将我们的User模型继承flask_login的UserMixin基类:


from flask_login import UserMixinclass User(db.Model,UserMixin):__tablename__='users'id=db.Column(db.Integer,primary_key=True)username=db.Column(db.String(64),unique=True,index=True)role_id=db.Column(db.Integer,db.ForeignKey('role.id'))hash_password=db.Column(db.String(28))



三、flask_login的初始化

        我们在app的工厂函数中,实现flask_login的初始化。为此,我们先引入LoginManager,并设置相关参数:

from flask_login import LoginManagerloginmanager=LoginManager()loginmanager.session_protection='strong'loginmanager.login_view='main.login'def create_app(config_name):  app=Flask(__name__)......loginmanager.init_app(app)......


       session_protection设置登录用户的安全级别,可选None、'basic'、'strong',安全等级由低到高。最高的安全等级‘strong’,flask_login会记住客户端的IP地址和用户代理信息,如果发现有不一致就登出用户。login_view设置的是我们进行登录操作的视图函数,因为我们打算在蓝本main中的login函数中进行登录测试,所以这里设置成了'main.index'。在create_app函数中,我们调用了loginmanager的init_app绑定了flask程序。

      初始化完成LoginManger之后,我们还要在模型中定义一个回调函数,用来登录验证时LoginManger从数据库加载用户:

from . import loginmanager@loginmanager.user_loaderdef load_user(id):return User.query.get(int(id))
四、使用login_user和logout_user进行用户的登录和登出

         login_user(User,bool)用来进行用户的登录,它接受两个参数,第一个是我们定义的User类的对象;第二个是个bool值,置为true会将用户的信息写到cookie中,下次打开浏览器会自动登录,置为flase,关闭浏览器后会话就会结束。logout_user()不需要传参,它会将本次会话登录的User进行登出。为了验证login_user和logout_user的使用,我们定义如下表单用来验证login_user和logout_user:


class NameForm(FlaskForm):  name=TextField('what is your name?',validators=[DataRequired()])password=PasswordField('what is your password?',validators=[DataRequired()])login=SubmitField('login')logout=SubmitField('logout')

        我们在表单中定义两个SubmitField,一个用来登录,一个用来登出。在视图函数中定义/login视图:



@main.route('/login',methods=['GET','POST'])def login():form=NameForm()user=User.query.filter_by(username=form.name.data).first()if form.validate_on_submit():if user is not None and user.confirm_password(form.password.data):if current_user.is_authenticated:logout_user()flash('User Logout')else:login_user(user,True)flash('User Login')return render_template('login.html',form=form)

        current_user是flask_login提供的一个全局的变量,表示当前登录的用户。它有一个is_authenticated的字段,如果有用户登录它将返回True,否则返回False。我们使用is_authenticated来判断用户是否登录,来显示是form显示login还是logout。对应的login.html内容如下:

<form method="POST">  	{% for message in get_flashed_messages() %}	 	<p>{{ message }}</p>	{% endfor %}{{form.hidden_tag()}}<p>{{form.name.label}}</p>{{form.name()}}<p>{{ form.password.label }}</p>{{ form.password() }}{%if current_user.is_authenticated %}	<br>{{form.logout}}	{% else %}	<br>{{form.login}}	{% endif %}</form>

        输入正确的账号和密码后,点击login按钮,效果如下:

用flask_login管理用户的登录_flask的用户权限控制

点击登出按钮,效果如下:

用flask_login管理用户的登录_flask的用户权限控制_02

五、使用login_required限制登录对象

        login_require是一个修饰器,可以限制url只有登录的用户可以访问,如下我们定义了一个私密的连接,只有用户登录后才能进行访问:

@main.route('/loginrq',methods=['GET','POST'])@login_requireddef loginrq():return 'I''m a private url'

        当我们在用户未登录的情况下,输入http://localhost:5000/loginrq时,flask会提示我们先进行登录:

用flask_login管理用户的登录_flask的用户权限控制_03

        你会发现,它不仅提示我们要先进行登录,而且还渲染了登录界面。这就是我们为什么在第三节初始化flask_login时要告诉它登录的视图函数的原因:

loginmanager.login_view='main.login'

        当我们登录之后,再次输入http://localhost:5000/loginrq,发现可以渲染我们定义的私密视图了:

用flask_login管理用户的登录_flask的用户权限控制_04

Github位置:
https://github.com/HymanLiuTS/flaskTs
克隆本项目:
Git clone Git@github.com:HymanLiuTS/flaskTs.git
获取本文源代码:
git checkout FL31