【问题标题】:flask admin: How to make a query according to the current user's id and role?flask admin:如何根据当前用户的id和角色进行查询?
【发布时间】:2017-10-06 00:36:43
【问题描述】:

我使用了以下课程,允许用户在注册后编辑自己的个人资料,效果很好。我使用get_queryget_count_query 实现了这一点。

但是,如果当前用户是 administrator,我如何自定义它以让他/她查看所有用户的个人资料,而不仅仅是他/她自己的个人资料?提前致谢。

 from flask_admin.contrib.sqla.view import ModelView, func

 class User(db.Model, UserMixin):
   id = db.Column(db.Integer, primary_key=True)
   first_name = db.Column(db.String(255))
   last_name = db.Column(db.String(255))
   email = db.Column(db.String(255), unique=True)
   password = db.Column(db.String(255))

   def __str__(self):
     return self.email

 class UserView(ModelView):
   """
   Restrict only the current user can see his/her own profile
   """
   def get_query(self):
      return self.session.query(self.model).filter(self.model.id==current_user.id)
   def get_count_query(self):
      return self.session.query(func.count('*')).filter(self.model.id==current_user.id)

【问题讨论】:

    标签: python flask flask-admin flask-security


    【解决方案1】:

    您可以为管理员定义另一个自定义ModelView。例如:

    class UserViewForAdmin(ModelView):
    
        def is_accessible(self):
            return current_user.has_role("admin")
        def inaccessible_callback(self, name, **kwargs):
            return redirect(url_for("security.login", next=request.url))
    
        pass
    
    admin = Admin(name="Flask-Admin Example")
    
    admin.add_view(UserView(User, db.session, name="Profile")
    admin.add_view(UserViewForAdmin(User, db.session, name="UserList", endpoint="users")
    

    本示例假设您使用Flask-Security 进行用户管理。

    【讨论】:

      【解决方案2】:

      这里的另一个选项是检查用户并在我们的get_queryget_count_query 中进行相应处理,例如:

      def get_query(self):
        if current_user.username == 'admin':
          return self.session.query(self.model)
        else:
          return self.session.query(self.model).filter(
            # your existing filter for user
          )
      

      注意:上面使用了来自flask_security的current_user,但可以很容易地适应其他逻辑。

      【讨论】:

        猜你喜欢
        • 2023-03-10
        • 1970-01-01
        • 2015-12-21
        • 1970-01-01
        • 2021-02-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-06
        • 1970-01-01
        相关资源
        最近更新 更多