【问题标题】:How to list all resources belong to one user in flask-appbuilder, instead of all?如何在flask-appbuilder中列出所有资源属于一个用户,而不是全部?
【发布时间】:2018-05-03 07:16:29
【问题描述】:

我已经简要浏览了 flask-appbuilder 的文档。在大多数示例中,ModelView 将列出所有资源。如果有相关视图,FAB 允许管理员(用户)根据其关系定义检查相关项目的详细信息。

但是,我不知道如何显示属于当前用户的资源。在其他框架中,很容易通过自定义 SQL 查询(where 语句)来实现。但是我没有从FAB示例中找到带有sql查询的演示项目,除了一些数据库testdate插入代码。

例如,让我们想象一个 IoT 相关项目。业主拥有很多设备,一台设备可以供多个用户使用。因此,

  • 作为管理员,他/她应该能够查看所有设备。
  • 作为所有者,他/她应该能够看到所有设备的归属。
  • 作为用户,他/她应该能够看到他/她可以使用的所有设备。

models.py

class Account(Model):
    id = Column(Integer, primary_key = True)
    username = Column(String(128), unique = True)
    password = Column(String(128))
    email = Column(String(128))
    cellphone = Column(String(32))

    def __repr__(self):
        return self.username

class Device(Model):
    id = Column(Integer, primary_key = True)
    snr = Column(String(256), unique = True)
    name = Column(String(128))
    addr = Column(String(256))
    latitude = Column(Float)
    longitude = Column(Float)
    status = Column(Enum('init','normal','transfer','suspend'), default = 'init')
    owner_id = Column(Integer, ForeignKey('account.id'))    
    owner = relationship("Account")

    def __repr__(self):
        return self.name

class Access(Model):
    id = Column(Integer, primary_key = True)
    name = Column(String(128))
    submit = Column(Date)
    approve = Column(Date)
    status = Column(Enum('init','approve','reject','expire'), default='init')
    dev_id = Column(Integer, ForeignKey('device.id'))
    device = relationship("Device")
    user_id = Column(Integer, ForeignKey('account.id'))    
    user = relationship("Account")

    def __repr__(self):
        return self.name

views.py

class AccessView(ModelView):
    datamodel = SQLAInterface(Access)

    label_columns = {}
    list_columns = ['device','owner','submit','approve']    

class DeviceView(ModelView):        
    datamodel = SQLAInterface(Device)
    related_views = [ApplicationView, EventView]

    label_columns = {'snr':'SNR', 
        'owner_id':'Owner'}
    list_columns = ['name','snr','addr','owner']
    edit_columns = ['name','snr','owner','addr','latitude','longitude','status']
    add_columns = edit_columns

    show_fieldsets = [
        ('Summary',
            {'fields':['name','snr','owner']}
        ),
        ('Device Info',
            {'fields':['addr','latitude','longitude','status'],'expanded':True}
        ),
    ]

@expose('/mine')
def mine(self):
    msg = "Mine Assets"
    return self.render_template('testpage.html', msg = msg)

@expose('/granted')
def granted(self):
    msg = "Granted Assets"
    return self.render_template('testpage.html', msg = msg)

db.create_all()

appbuilder.add_view(DeviceView,
    "My Devices",
    icon = "fa-heart",
    category = "Devices",
    category_icon = "fa-microchip")

appbuilder.add_view(AccountView,
    "Account",
    icon = "fa-group",
    category = "Devices")

appbuilder.add_view(AccessView,
    "Access",
    icon = "fa-handshake-o",
    category = "Devices")

如果我们为三个视图定义了以下 URL:

  • 管理员,/deviceview/list
  • 所有者,/deviceview/mine
  • 用户,/deviceview/granted

但是,我不知道如何编写我的/授予的方法。通过使用 db.session.query() ?

db.session.query(Device, owner=owner)db.session.query(Access, user=user)

或者我还没有阅读的任何文件?

【问题讨论】:

    标签: flask-appbuilder


    【解决方案1】:

    我为此找到了一种解决方案,至少是部分答案。除了用于管理员的 DeviceView 之外,我还定义了另一个 DeviceXView(作为临时名称)作为当前用户的设备列表,并使用 base_filter 从模型中缩小数据集。

    class DeviceXView(ModelView):        
        datamodel = SQLAInterface(Device)
        base_filters = [['owner', FilterEqualFunction, get_user],]
        related_views = [ApplicationView, EventView]
    
        label_columns = {'snr':'SNR', 
            'api_dev_id':'Device ID', 
            'api_dev_key':'Device Key',
            'api_id':'API ID',
            'api_key':'API Key',
            'owner_id':'Owner'}
        list_columns = ['name','snr','addr','owner']
        edit_columns = ['name','snr','owner','addr','latitude','longitude','status','api_id','api_key','api_dev_id','api_dev_key']
        add_columns = edit_columns
    
        show_fieldsets = [
            ('Summary',
                {'fields':['name','snr','owner']}
            ),
            ('Device Info',
                {'fields':['addr','latitude','longitude','status','api_id','api_key','api_dev_id','api_dev_key'],'expanded':True}
            ),
        ]
    

    这适用于当前用户拥有的所有设备。为了显示用户可以访问的所有设备,我们可以将AccessView和DeviceView定义为相关View。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-11
      • 2020-03-08
      • 2019-09-23
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      相关资源
      最近更新 更多