首页 > 解决方案 > Flask-Login 如何检查用户是否具有某个属性值

问题描述

我目前正在使用烧瓶登录来验证我的网站。我的模型是一个简单的用户(带有 id、邮件等),它有一个 admin(boolean) 属性。我不需要超过 2 个角色。

如果当前用户在 admin 属性中具有值“True”,是否有任何方法可以在调用路由后进行检查?

我尝试通过尝试自定义装饰器以及访问 session['admin'] 来解决此问题,但它不起作用。

标签: pythonauthenticationflaskwebflask-login

解决方案


正如@Agung Wiyono 评论的那样,Flask-Login 提供了一个current_user变量,请参阅docs

在您的路线中,您可以执行以下操作:

from flask_login import current_user

@app.route("/test")
@login_required
def test():

    if current_user.admin:
        print('user is admin')

    #  blah blah

如果您不想使用login_required装饰器:

@app.route("/test")
def test():

    if current_user.is_authenticated and current_user.admin:
        print('user is authenticated and is an admin')

    #  blah blah

如果您想使用装饰器来检查current_useradmin 值是否为True

def admin_role_required(func):
    @wraps(func)
    def decorated_view(*args, **kwargs):
        if request.method in EXEMPT_METHODS:
            return func(*args, **kwargs)
        elif not current_user.admin:
            abort(403)
        return func(*args, **kwargs)
    return decorated_view

这段代码或多或少是 的代码@login_required,除了它检查admin属性的状态 - 参见源代码

并如下使用。注意装饰器的顺序很重要。@login_required先被调用,然后@admin_role_required被调用。装饰器admin_role_required假定current_user已经过身份验证。如果admin_role_required首先调用,则current_user代理将没有属性admin,并且您会遇到错误。

@app.route("/test")
@admin_role_required
@login_required
def test():

    #  need to be logged in and admin be True to get here
    
    #  blah blah

推荐阅读