Flask之用户登录

作者: welkinz | 来源:发表于2017-05-02 21:57 被阅读0次

    使用会话

    使用会话对象是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之用户登录

        本文链接:https://www.haomeiwen.com/subject/ydphtxtx.html