flask - 管理用户角色

时间:2018-03-29 00:34:18

标签: flask user-roles flask-login

我有一个网站,用户可以拥有多个角色(通常用户将拥有多个角色)。我想要做的只是添加和删除用户角色。

html方面非常简单。我有一个选择2多选框,可以加载所有可能的用户角色。我选择或取消选择角色,然后提交。

表单只有2个变量;用户名和角色

我有一个简单的for循环if语句,但我似乎有2个问题。 1由于某种原因,if语句永远不会是'True'。第二个问题是for循环似乎退出它评估1变量而不是实际循环遍历所有变量。

    formroleadmin = AdminUserRoles()  # if roles administered
    if formroleadmin.roles.data and formroleadmin.validate(): #if form is submitted
        # ar = all roles er = existing roles ur = updated roles
        allroles = usersRolesNames.query.all() #query all possible roles
        usr = formroleadmin.username.data #submitted user name
        ur = formroleadmin.roles.data #load the submitted roles
        er = usersRoles.query.filter_by(username_fk=usr).all() #get current user roles
        for ar in allroles: #loop through all possible roles
            if ar in ur:  # if the role is a submitted role
                if ar not in er:  # if role does not exist add it #if role is not assigned
                    db.session.add(usersRoles(username_fk=usr, role_fk=ar)) #add user
                    db.session.commit()
            elif ar not in ur:  # remove it if exists #if not a submitted role
                if ar in er: # remove if user is assigned role remove permission
                    db.session.filter_by(username_fk=usr, role_fk=ar).delete

内容示例

allroles = ['Admin', 'Completions', 'Completions RW', 'Operations'
ur = ['Completions', 'Operations']

所以我尝试做的基本顺序是遍历allroles(ar)并针对ur测试每个值。如果角色存在或不存在,那么它将被添加,删除或传递等。

1 个答案:

答案 0 :(得分:0)

通过在迭代的变量周围添加str()来解决这个问题。 @LoganBertram给了我建议来跟踪这个错误。下面列出了更新的代码(日志记录和故障排除是在iPython中完成的)。

记录已添加

import logging
logging.basicConfig(level=logging.DEBUG)

for u in ar:
    if u in ur:
        logging.debug('found u {} ur {}'.format(u, ur))
    else:
        logging.debug('not found u {} ur {}'.format(u, ur))

DEBUG:root:not found u Admin ur ['Admin', 'Completions']
DEBUG:root:not found u Completions ur ['Admin', 'Completions']

我将代码更改为此内容;

for u in ar:
    if str(u) in ur:
        logging.debug('found u {} ur {}'.format(u, ur))
    else:
        logging.debug('not found u {} ur {}'.format(u, ur))

并得到了这个结果

DEBUG:root:found u Admin ur ['Admin', 'Completions']
DEBUG:root:found u Completions ur ['Admin', 'Completions']