【问题标题】:Flask-Appbuilder - User security role required in ViewFlask-Appbuilder - View 中需要用户安全角色
【发布时间】:2019-09-23 13:35:16
【问题描述】:

如果当前用户角色 = admin 则显示表中的所有记录。如果没有,则按创建的用户限制行数。

如果我在视图类中定义了一个函数,我可以获得用户名,但在构造列表之前需要它。请参阅下面的源代码。

from flask_appbuilder.models.sqla.filters import FilterEqualFunction
from app import appbuilder, db
from app.models import Language
from wtforms import validators, TextField
from flask import g
from flask_appbuilder.security.sqla.models import User

def get_user():
    return g.user

class LanguageView(ModelView):
    datamodel = SQLAInterface(Language)
    list_columns = ["id", "name"]
    base_order = ("name", "asc")
    page_size = 50

    #This is the part that does not work - unable to import app Error: Working outside of application context
    #If the user role is admin show all, if not filter only to the specific user
    if g.user.roles != "admin":
        base_filters = [['created_by', FilterEqualFunction, get_user]]    

这是我得到的错误:

无法导入应用程序错误:在应用程序上下文之外工作。

这通常意味着您尝试使用需要的功能 以某种方式与当前应用程序对象交互。解决 这个,用 app.app_context() 设置一个应用程序上下文。见 文档以获取更多信息。

【问题讨论】:

    标签: flask-appbuilder


    【解决方案1】:

    在这种情况下,最好创建两个不同的模型视图,一个用于base_filters = [['created_by', FilterEqualFunction, get_user]] 的用户,第二个仅用于管理员,没有任何过滤。

    不要忘记为两者指定正确的权限。

    【讨论】:

      【解决方案2】:

      就我而言,我通过处理 FilterStartsWith 创建了新的过滤器 FilterStartsWithFunction(您可以在 Flask-Appbuilder 包中轻松找到源代码。)。查看代码

      from flask_appbuilder.models.sqla.filters import get_field_setup_query
      
      class FilterStartsWithFunction(BaseFilter):
          name = "Filter view with a function"
          arg_name = "eqf"
      
          def apply(self, query, func):
              query, field = get_field_setup_query(query, self.model, self.column_name)
              return query.filter(field.ilike(func() + "%"))
      
      def get_user():
          if 'Admin' in [r.name for r in g.user.roles]:
              return ''
          else:
              return g.user.username
      
      ...
      ...
      
          base_filters = [['created_by',FilterStartsWithFunction,get_user]]
      

      【讨论】:

        猜你喜欢
        • 2021-10-26
        • 2018-12-02
        • 2015-03-17
        • 2016-05-29
        • 1970-01-01
        • 1970-01-01
        • 2017-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多