问题描述
我想列出给定用户的所有角色。
我不是在寻找 current_user
也不是 has_role
。
这个想法是制作一个“edituser.html”,管理员可以在其中更改/添加/删除给定用户的角色。对于该用例,我需要显示要编辑的用户具有哪些角色。
我已阅读:Flask Security- check what Roles a User has,但我不明白如何在例如路线/视图中使用它。
我的models.py是这样的。
class Role(db.Document,RoleMixin):
def __str__(self):
return self.name
name = db.StringField(max_length=80,unique=True)
description = db.StringField(max_length=255)
permissions = db.StringField(max_length=255)
class User(db.Document,UserMixin):
def __str__(self):
return self.username
username = db.StringField(max_length=255)
password = db.StringField(max_length=255)
active = db.BooleanField(default=True)
fs_uniquifier = db.StringField(max_length=64,unique=True)
confirmed_at = db.DateTimeField()
current_login_at = db.DateTimeField()
last_login_at = db.DateTimeField()
current_login_ip = db.StringField(max_length=255)
last_login_ip = db.StringField(max_length=255)
login_count = db.IntField(max_length=255)
roles = db.ListField(db.ReferenceField(Role),default=[])
user_datastore = MongoEngineUserDatastore(db,User,Role)
解决方法
这是我在我的应用中执行的操作:
@staticmethod
def get_users():
"""Return list of all users"""
attrs = (
"email","active","confirmed_at","create_datetime","update_datetime","last_login_at","current_login_at","current_login_ip",)
query = current_app.sywuserdb.user_model.query
users = query.all()
# convert to a list of dict of interesting info
rv = []
for user in users:
# copy simple attributes
userdata = {}
for attr in attrs:
userdata[attr] = getattr(user,attr)
userdata["roles"] = [r.name for r in user.roles]
rv.append(userdata)
# users is a list of tuples - convert to list of dict
return {"status": 200,"msgs": [],"data": rv}
将“sywuserdb”更改为您的数据存储(您问题中的“user_datastore”)。
这被称为 API 的一部分 - 我有一个“管理员”蓝图,其中定义了以下端点:
@api.route("/users",methods=["GET"])
@auth_required("token","session")
@roles_accepted("admin")
def get_users():
rv = get_users()
return flask.jsonify(rv),rv["status"]
忽略@staticmethod - 那是因为我将它作为 UserFactory 类的一部分,因为我有一堆管理方法和 API 来管理用户。