【问题标题】:Flask-Admin different forms and column_list for different rolesFlask-Admin 不同的表单和 column_list 用于不同的角色
【发布时间】:2018-05-07 08:23:34
【问题描述】:

跟进这个问题Flask-Admin Role Based Access - Modify access based on role 我不明白如何实现基于角色的视图,尤其是关于表单和列列表。

假设如果用户是普通用户或超级用户,我希望 MyModelView 显示不同的列。

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_userNoneType 错误,根据 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 继承的任何类。

【问题讨论】:

  • 为什么没有定义current_user?你没有使用flask_login吗?
  • 不是直接登录烧瓶,用导入更新帖子
  • current_user 在请求之外不存在 (stackoverflow.com/questions/12710036/…)

标签: python flask flask-admin


【解决方案1】:

我通常将视图类属性如column_list定义为属性。它允许您向它们添加一些动态逻辑:

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 值没有效果)是许多视图属性在应用程序启动时被缓存并存储在私有属性中。 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

【讨论】:

    猜你喜欢
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2015-10-18
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多