flask-appbuilder - Flask-Appbuilder - View 中需要用户安全角色
问题描述
如果当前用户角色 = 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() 设置应用程序上下文。有关更多信息,请参阅文档。
解决方案
就我而言,我通过处理 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]]
推荐阅读
- django - 如何在 django 中使用数据库信息填充选择选项下拉列表
- objective-c - 如何查看apns的obj-c版本
- python-3.x - Python - 函数不返回 y 值
- python - Python 2 到 3 struct.pack 和字符串
- python - 使用没有 Pandas 的基本 Python 将字典转换为具有列名的表
- c++ - C++ 问题“超时:被监控的命令转储核心”
- ruby-on-rails - 无法将 CSS 与 Webpacker 6.0.0.beta.6 一起使用
- ruby-on-rails-3 - 为什么我安装 bundler 后提示没有安装 bundler?
- c++ - 如何在 Clang 中编译带有类的项目?
- python - 熊猫使用上一时期填充行值