flask admin:如何根据当前用户的id和角色进行查询?
flask admin: How to make a query according to the current user's id and role?
我使用了下面的类,允许用户在注册后编辑自己的个人资料,效果很好。我使用 get_query
和 get_count_query
实现了这一点。
但是,如果当前用户是 管理员,我如何自定义它以让 him/her 查看所有用户的配置文件,而不仅仅是 his/her 自己的配置文件轮廓?提前致谢。
from flask_admin.contrib.sqla.view import ModelView, func
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(255))
last_name = db.Column(db.String(255))
email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
def __str__(self):
return self.email
class UserView(ModelView):
"""
Restrict only the current user can see his/her own profile
"""
def get_query(self):
return self.session.query(self.model).filter(self.model.id==current_user.id)
def get_count_query(self):
return self.session.query(func.count('*')).filter(self.model.id==current_user.id)
您可以为管理员定义另一个自定义 ModelView
。例如:
class UserViewForAdmin(ModelView):
def is_accessible(self):
return current_user.has_role("admin")
def inaccessible_callback(self, name, **kwargs):
return redirect(url_for("security.login", next=request.url))
pass
admin = Admin(name="Flask-Admin Example")
admin.add_view(UserView(User, db.session, name="Profile")
admin.add_view(UserViewForAdmin(User, db.session, name="UserList", endpoint="users")
该示例假设您使用 Flask-Security
进行用户管理。
此处的另一个选项是检查用户并在我们的 get_query
或 get_count_query
中进行相应处理,例如:
def get_query(self):
if current_user.username == 'admin':
return self.session.query(self.model)
else:
return self.session.query(self.model).filter(
# your existing filter for user
)
注意:上面使用 flask_security 中的 current_user
但可以很容易地适应其他逻辑。
我使用了下面的类,允许用户在注册后编辑自己的个人资料,效果很好。我使用 get_query
和 get_count_query
实现了这一点。
但是,如果当前用户是 管理员,我如何自定义它以让 him/her 查看所有用户的配置文件,而不仅仅是 his/her 自己的配置文件轮廓?提前致谢。
from flask_admin.contrib.sqla.view import ModelView, func
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(255))
last_name = db.Column(db.String(255))
email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
def __str__(self):
return self.email
class UserView(ModelView):
"""
Restrict only the current user can see his/her own profile
"""
def get_query(self):
return self.session.query(self.model).filter(self.model.id==current_user.id)
def get_count_query(self):
return self.session.query(func.count('*')).filter(self.model.id==current_user.id)
您可以为管理员定义另一个自定义 ModelView
。例如:
class UserViewForAdmin(ModelView):
def is_accessible(self):
return current_user.has_role("admin")
def inaccessible_callback(self, name, **kwargs):
return redirect(url_for("security.login", next=request.url))
pass
admin = Admin(name="Flask-Admin Example")
admin.add_view(UserView(User, db.session, name="Profile")
admin.add_view(UserViewForAdmin(User, db.session, name="UserList", endpoint="users")
该示例假设您使用 Flask-Security
进行用户管理。
此处的另一个选项是检查用户并在我们的 get_query
或 get_count_query
中进行相应处理,例如:
def get_query(self):
if current_user.username == 'admin':
return self.session.query(self.model)
else:
return self.session.query(self.model).filter(
# your existing filter for user
)
注意:上面使用 flask_security 中的 current_user
但可以很容易地适应其他逻辑。