gpt4 book ai didi

python - Flask-Admin 针对不同角色的不同表单和column_list

转载 作者:太空狗 更新时间:2023-10-30 02:54:02 25 4
gpt4 key购买 nike

跟进这个问题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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com