Flask-login提供用户session管理,它解决了用户登录,登出,在长时间内能记住你的用户的session。
用处:
- 储存已激活的用户ID到session中,方便用户登录和登出
- 对已登录用户或登出用户限制视图
- 提供“remember me”功能
- 帮助你防止你的session被cookie小偷盗掉
- 将认证扩展和Flask整合到一起
然而,它无法做到:
- 不提供数据库或其他储存方法给你,你必须自己负责如何加载数据
- 限制你使用用户名和密码,开放ID和其他认证方法
- 处理登录用户和匿名用户的权限
- 解决用户注册和找回
安装
pip install flask-login
配置
首先,使用flask-login的应用程序中最重要的部分就是要有Loginmanager类,你必须在你的应用程序中创建该类的实例
login_manager = LoginManager()
如果你已经创建了一个应用程序实例app,接下来,就是把它装进login_manager里,这样login manager才能够让你的应用app和Flask-login一起工作,比如,当用户需要登录的时候,login manager就会根据id来加载用户。
login_manager.init_app(app)
如何工作?
你需要提供一个user_loader回调函数,这个回调函数是用来从存储在session中的ID里加载用户对象,根据用户的unicode ID,返回用户对象
@login_manager.user_loader
def load_user(user_id):
return User.get(user_id)
当然,如果ID无效的话,就返回None(不报异常)
User类
你的User类还得要实现下面4种方法
- is_authenticated()–如果用户已认证,则返回True。(只有认证用户才能使用login_required装饰器)
- is_active()–如果用户已激活,则返回True.除了认证,用户还需要激活他们的账户,确保他们不是僵尸。未激活账户将无法登陆(当然,这不是强制性的)
- is_anonymous()–如果用户是匿名游客,则返回True.(真实用户应该返回False)
- get_id()–这个方法会返回一个唯一的Unicode ID,被用来从回调函数load_user()中加载用户,记住这里必须是一个Unicode,如果ID是int或其他类型的话,需要将其转化为Unicode
为了更快捷地实现上面4种方法,我们可以让User类继承UserMixin
from flask_login import UserMixin
class User(UserMixin):
登录举例
如果有一位用户已经认证过了,你现在就可以使用login_user()来登录他
@app.route('/login', methods = ['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
user = User(xxx)
login_user(user) #表登陆
flash('login successfully')
next = request.args.get('next')
if not is_safe_url(next):
return abort(400)
return redirect(next or url_for('index'))
return render_template('index.html', form = form)
注意:你必须要检验next的值,不这样做的话,你的应用程序将会很容易受到攻击
现在你可以在每个模板中使用current_user来表示已登录用户
{% if current_user.is_authenticated %}
Hi {{current_user.username}}
{% endif %}
为了保证路由只被已认证的用户访问,flask-login提供了login_required装饰器
@app.route('/setting')
@login_required
def setting():
pass
当用户选择登出时,
@app.route('logout')
@login_required
def logout():
logout_user() # 表退出
return redirect(somewhere)
定制登陆
默认情况下,当一个未登录用户试图访问一个login_required页面时,Flask-login会将页面跳转到登录界面,并且会发消息让你先登录。(如果你还没有设置你的登陆页面的话,就会abort一个401 error)
现在我们来设置登陆页面
login_manager.login_view = '蓝本名.login'
默认的消息是’Please log in to access this page’.当然,你也可以对消息进行定制
login_manager.login_message = u"xxxxxxxxxx"