我已经简要浏览了 flask-appbuilder 的文档。在大多数示例中,ModelView 将列出所有资源。如果有相关视图,FAB 允许管理员(用户)根据其关系定义检查相关项目的详细信息。
但是,我不知道如何显示属于当前用户的资源。在其他框架中,很容易通过自定义 SQL 查询(where 语句)来实现。但除了一些数据库测试日期插入代码外,我没有从 FAB 示例中找到带有 sql 查询的演示项目。
例如,让我们想象一个 IoT 相关项目。业主拥有很多设备,一台设备可以供多个用户使用。所以,
- 作为管理员,他/她应该能够看到所有设备。
- 作为所有者,他/她应该能够看到所有设备属于。
- 作为用户,他/她应该能够看到他/她可以使用的所有设备。
模型.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
视图.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/我的
- 用户,/deviceview/授予
但是,我不知道如何编写我的/授予的方法。通过使用 db.session.query() ?
db.session.query(Device, owner=owner)或db.session.query(Access, user=user)
或者我还没有阅读的任何文件?