本文主要介绍使用flask_login管理用户的登录和登出。flask_login的安装:
pip install flask-login
使用flask_login进行用户的登录和登出管理,需要将我们的User模型继承flask_login的UserMixin基类:
from flask_login import UserMixin
class 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))
from flask_login import LoginManager
loginmanager=LoginManager()
loginmanager.session_protection='strong'
loginmanager.login_view='main.login'
def create_app(config_name):
app=Flask(__name__)
......
loginmanager.init_app(app)
......
from . import loginmanager
@loginmanager.user_loader
def load_user(id):
return User.query.get(int(id))
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内容如下:
输入正确的账号和密码后,点击login按钮,效果如下:
点击登出按钮,效果如下:
@main.route('/loginrq',methods=['GET','POST'])
@login_required
def loginrq():
return 'I''m a private url'
当我们在用户未登录的情况下,输入http://localhost:5000/loginrq时,flask会提示我们先进行登录:
loginmanager.login_view='main.login'
当我们登录之后,再次输入http://localhost:5000/loginrq,发现可以渲染我们定义的私密视图了: