【问题标题】:Flask Admin - Restrict CRUD functions for own user contentFlask Admin - 限制自己用户内容的 CRUD 功能
【发布时间】:2019-05-19 22:23:30
【问题描述】:

我想知道是否有人成功地限制了烧瓶管理员的 CRUD 功能。或者,如果这完全是正确的工具。

我想做的是以某种方式转换模型视图,以便用户只能编辑自己的内容。示例:数据库表“餐厅菜单”包含不同餐厅提供的菜肴。如果一家餐厅希望更改某些内容,他们应该能够更改和查看自己的内容,但不能查看其他餐厅的内容。理想情况下,使用 sqlalchemy 有一种简单的方法——我首先查询“用户”模型并获取与用户相关的餐厅,然后将其传递给 ModelView 类。

是否有一个简单的实现来做这样的事情,或者是否有其他的 CMS 系统可以更容易地处理这样的功能?

【问题讨论】:

  • 我在我的应用程序中做了类似的事情,其中​​一部分覆盖了内置函数,如 def get_query(self) 和 def get_count_query(self),当然还有许多其他自定义代码。当您创建超过 1 个管理员实例时,甚至可以进行基于角色的分离。
  • 非常感谢!快速尝试并覆盖了 get_query(self) 方法。我可以通过按 id 过滤来过滤视图的用户特定内容。您是否也知道如何预填充“编辑功能”,以便新条目自动与该用户关联?
  • 是的,例如通过覆盖 form_args、form_choices、query_factory 等。只需查看 Flask-Admin 文档和源代码。这就是我所指的我的自定义代码。如果您有具体问题,请分享您的代码,我们可以帮助您针对您的用例进行定制。

标签: flask sqlalchemy flask-sqlalchemy crud flask-admin


【解决方案1】:

所以,我更深入地浏览了源代码。非常感谢 gittert 的帮助。

请注意,在我的解决方案中,我确实想限制一个特定列的查看和编辑功能,该列也是来自不同表的外键。

所以为了限制视图函数,我确实覆盖了之前帖子中发布的 get_query() 和 get_count_query():

##  overwrite
def get_query(self):
    self._auto_fush_deactivate()
    return super(CustomView, 
self).get_query().filter(User.id== 1)

def get_count_query(self):
    return self.session.query(func.count('*')).filter(User.id == 1)

为了让用户只能在表中使用他的 OWN 外键添加新数据,我还重写了 on_model_create() 函数。

def on_model_change(self, form, model, is_created):

    ### deactivate auto_flush temp. to not receive data integrity error
    self._auto_fush_deactivate()
    ### create model from table user
    overwrite_model = self.session.query(User).filter(User.id== 1).first()

    ### overwrite the user id with model from User-Model
    model.user_id =  overwrite_model
    self._auto_fush_activate()

def _auto_fush_deactivate(self):
    self.session.autoflush = False

def _auto_fush_activate(self):
    self.session.autoflush = True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    相关资源
    最近更新 更多