这是关于Flask-appbuilder的一个非常具体的问题。在开发过程中,我发现FAB的ModelView适合管理角色,但需要更多用户逻辑处理程序/视图来处理复杂的设计。
设备与用户之间存在多对多的关系,因为每个设备可以在多个用户之间共享,每个用户可以拥有多个设备。因此,有一个名为 accessses 的辅助表,描述了设备和用户之间的访问控制。在此表中,我添加了#34; isHost"只是用户拥有该设备。因此,我们有两个角色:主机和(常规)用户。但是,这些角色不是定义为其他应用程序的两个角色,因为一个人可以同时是主机或用户。在一个非常简单的应用程序中,强制用户切换两个角色都不是很方便。这会让事情变得更糟。
无论如何,我需要使用传统的Flask / Jinja2模板设计一些自定义处理程序。例如:
class PageView(ModelView):
# FAB default URL: "/pageview/list"
datamodel = SQLAInterface(Page)
list_columns = ['name', 'date', 'get_url']
@expose("/p/<string:url>")
def p(self, url):
title = urllib.unquote(url)
r = db.session.query(Page).filter_by(name = title).first()
if r:
md = r.markdown
parser = mistune.Markdown()
body = parser(md)
return self.render_template('page.html', title = title, body = body)
else:
return self.render_template('404.html'), 404
以上降价页面网址很简单,因为它是一个单独的用户界面。但是如果我去DeviceView / AccountView / AccessView进行列表/显示/添加/编辑操作。我意识到我需要一种独特的UI风格。
那么,现在如何使用自定义sqlalchemy查询重用现有的FAB模板/小部件?这是我的DeviceView代码。
class DeviceView(ModelView):
datamodel = SQLAInterface(Device)
related_views = [EventView, AccessView]
show_template = 'appbuilder/general/model/show_cascade.html'
edit_template = 'appbuilder/general/model/edit_cascade.html'
@expose('/host')
@has_access
def host(self):
base_filters = [['name', FilterStartsWith, 'S'],]
#if there is not return, FAB will throw error
return "host view:{}".format(repr(base_filters))
@expose('/my')
@has_access
def my(self):
# A pure testing method
rec = db.session.query(Access).filter_by(id = 1).all()
if rec:
for r in rec:
print "rec, acc:{}, dev:{}, host:{}".format(r.account_id, r.device_id, r.is_host)
return self.render_template('list.html', title = "My Accesses", body = "{}".format(repr(r)))
else:
return repr(None)
除了使用render_template()的sqlalchemy代码之外,我猜base_filters也可以帮助定义自定义查询,但是,我不知道如何获取查询结果并将其渲染。
如果可能,请给我一些参考代码或示例。实际上我在FAB的github源代码中有&#34; db.session / render_template / expoaw&#34;的grep关键字。但没有运气。