使用会话
使用会话对象是Flask中实现身份认证的一种方式。会话(session)让服务端可以通过一种简单的方式,在用户浏览器的cookie中保存信息。保存的信息通过应用的密钥进行了加密签名,如果用户试图修改cookie的值,那么签名就会失效。
往会话中添加数据很简单,只需要
session['key'] = data
若要读取数据,则可以
session['key']
要让用户处于登录状态,则可以向会话里添加一个username属性,并且设为当前用户的用户名:
@main_blueprint.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
session['username'] = form.username.data
return render_template('login.html', form=form)
若使用户登出,则可以调用pop方法移除该属性:
session.pop('username', None)
要判断当前用户是否处于登录状态,则可以在视图函数中检查会话里是否有username属性,比如新建文章视图:
@blog_blueprint.route('/new', methods=['GET', 'POST'])
def new_post():
if 'username' not in session:
return redirect(url_for('main.login'))
...
如果其它模板也需要知道当前用户的信息,我们可以在开始响应每个请求之前,在blog蓝图中检查会话对象,里面若存在username,就把该对象添加到g对象上,这样就可以在模板中访问了:
@blog_blueprint.before_request
def check_user():
if 'username' in session:
g.current_user = User.query.filter_by(
username=session['username']).first()
else:
g.current_user = None
这样我们可以把前面的new_post修改一下:
def new_post():
if not g.current_user:
...
现在,我们已经实现里简单的用户登录的验证机制。但是,还有一些功能没有实现,比如用户的权限分级,登录时没有“记住我”的功能。要实现这些,我们可以使用flask-login扩展。
使用Flask Login
Flask-Login用来管理已登录用户的用户会话,主要有以下几个方法:
- load_user() 本函数的参数是要登录的用户,以及可选的“记住我”布尔值。(如果值为False,那么关闭浏览器后用户会话就会过期。如果值为True,那么会在浏览器中写入一个长期有效的cookie,使用这个cookie可以复现用户会话。)
- logout_user() 删除并重设用户会话。
- is_active() 如果允许用户登录,必须返回True,否则返回False。
- is_authenticated() 如果用户已经登录,必须返回True,否则返回False。
- is_anonymous() 对普通用户返回False。
Flask Login还提供了一个 current_user 代理对象来访问当前的登录用户。这个代理对象在视图和模板都是可以访问的。所以我们在博客蓝图中自定义的 before_request 函数就可以删掉了,而且对 g.current_user 的调用可以改为 current_user 。
网友评论