Как повторно использовать шаблон в Flask-appbuilder с открытыми пользовательскими обработчиками?

Это очень специфический вопрос относительно Flask-appbuilder. Во время моей разработки я обнаружил, что ModelView FAB подходит для роли администратора, но для сложных конструкций требуется больше обработчиков / представлений пользовательской логики.

Между устройствами и пользователями существует много-много взаимосвязей, поскольку каждое устройство может совместно использоваться многими пользователями, и каждый пользователь может владеть многими устройствами. Таким образом, существует вторичная таблица, называемая доступом, описывающая управление доступом между устройствами и пользователями. В этой таблице я добавляю "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

Над страницей уценки URL-адрес прост, так как это отдельный пользовательский интерфейс. Но если я перейду к DeviceView/AccountView/AccessView для операций со списком / показом / добавлением / редактированием. Я понял, что мне нужны уникальные стили пользовательского интерфейса.

Итак, как теперь можно повторно использовать существующие шаблоны / виджеты FAB с пользовательскими запросами sqlalchemy? Вот мой код для 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)

Кроме кода sqlalchemy с render_template(), я думаю, base_filters также может помочь в определении пользовательских запросов, однако я понятия не имею, как получить результат запроса и отрендерить его.

Пожалуйста, дайте мне ссылочный код или пример, если это возможно. На самом деле у меня есть ключевые слова grep "db.session/render_template/expoaw" в источниках GAB FAB. Но не повезло.

0 ответов

Другие вопросы по тегам