- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
跟进这个问题Flask-Admin Role Based Access - Modify access based on role我不明白如何实现基于角色的 View ,尤其是关于表单和列列表。
假设我希望 MyModelView
在用户是普通用户或 super 用户时显示不同的列。
在 MyModelView
中覆盖 is_accessible
根本没有效果
from flask_security import Security, SQLAlchemyUserDatastore, current_user
class MyModelView(SafeModelView):
# ...
def is_accessible(self):
if current_user.has_role('superuser'):
self.column_list = superuser_colum_list
self.form_columns = superuser_form_columns
else:
self.column_list = user_colum_list
self.form_columns = user_form_columns
return super(MyModelView, self).is_accessible()
# Has same effect as
def is_accessible(self):
return super(MyModelView, self).is_accessible()
并且定义条件类属性也不起作用,因为 current_user
未定义(NoneType
错误,根据 AttributeError on current_user.is_authenticated() )。在 ModelView 的 __init__
中做同样的事情是等价的,current_user
仍然没有定义
class MyModelView(SafeModelView):
#[stuff]
if current_user.has_role('superuser'):
column_list = superuser_colum_list
form_columns = superuser_form_columns
else:
column_list = user_colum_list
form_columns = user_form_columns
#[other stuff]
仅供引用,SafeModelView
可以是从前面提到的问题中的 dgBaseView
继承的任何类。
最佳答案
我通常将column_list
等 View 类属性定义为properties。它允许您向它们添加一些动态逻辑:
from flask import has_app_context
from flask_security import current_user
class MyModelView(SafeModelView):
@property
def column_list(self):
if has_app_context() and current_user.has_role('superuser'):
return superuser_column_list
return user_column_list
@property
def _list_columns(self):
return self.get_list_columns()
@_list_columns.setter
def _list_columns(self, value):
pass
使用这种方法的问题(以及为什么在 is_accessible
函数中重新分配 column_list
值没有效果)是许多 View 属性在应用程序启动时缓存并存储在私有(private)属性中。例如,column_list
缓存在 _list_columns
属性中,因此您也需要重新定义它。您可以在 flask_admin.model.base.BaseModelView._refresh_cache 中查看此缓存的工作原理方法。
此处需要 Flask has_app_context
方法,因为当您的 current_user
变量还没有有意义的值时,第一个 column_list
读取发生在应用程序启动时。
同样可以用 form_columns
属性来完成。属性将如下所示:
@property
def form_columns(self):
if has_app_context() and current_user.has_role('superuser'):
return superuser_form_columns
return user_form_columns
@property
def _create_form_class(self):
return self.get_create_form()
@_create_form_class.setter
def _create_form_class(self, value)
pass
@property
def _edit_form_class(self):
return self.get_edit_form()
@_edit_form_class.setter
def _edit_form_class(self, value):
pass
关于python - Flask-Admin 针对不同角色的不同表单和column_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47454315/
我需要将 SQLAlchemy 模型类的自定义属性添加到我的 Flask-Admin View 中。它做了一些我想显示在我的列列表中的计算。 class Withdrawal(db.Model):
我是一名优秀的程序员,十分优秀!