Как повторно использовать шаблон в 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. Но не повезло.