Flask之用户登录

使用会话

使用会话对象是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 。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 关于Flask-Login的用例 重访我们的用户模型 Flask-Login扩展需要在我们的User类里实现一些方...
    冰西瓜大郎阅读 1,923评论 0 3
  • 最近在学习flask,用到flask-login,发现网上只有0.1版本的中文文档,看了官方已经0.4了,并且添加...
    ZZES_ZCDC阅读 5,982评论 3 24
  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,231评论 22 257
  • 第二部分 Blog例子 第八章 用户验证 大部分程序需要追踪用户身份。当用户连接到程序,通过一系列步骤使自己的身份...
    易木成华阅读 1,323评论 0 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,963评论 19 139