如何使用暴露的自定义处理程序在Flask-appbuilder中重用模板?

时间:2018-01-06 14:45:29

标签: flask flask-appbuilder

这是关于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关键字。但没有运气。

0 个答案:

没有答案