我们有一个基于link的Airflow自定义UI,它在Airflow 1.9.0上运行良好。 在此之后,我们升级到1.10.1,并启用了RBAC。此后,我们的自定义界面停止了。
我们遵循了note-on-role-based-views的解释,并尝试将旧的UI模板与appbuilder_views一起使用。在使用/tests/plugins/test_plugin.py中的TestAppBuilderBaseView时,
class TestAppBuilderBaseView(AppBuilderBaseView):
@expose("/")
def test(self):
return self.render("test_plugin/test.html", content="Hello galaxy!")
我们获得了菜单和链接,但是单击时会出现错误
对象没有属性“渲染”
将其更改为
return self.render_template("test_plugin/test.html",content="Hello galaxy!")
我们收到错误
jinja2.exceptions.TemplateNotFound:test_plugin / test.html
我尝试了所有可能的组合来放置模板文件夹和html文件,但仍然是相同的错误。
我确实找到了一些论坛,要求在Blueprint上启用调试。但我不知道如何使用Airflow
对此有任何指导吗?。
在此先感谢
詹森
答案 0 :(得分:2)
版本1.10.0发行时,存在一个错误,无法在新UI中正确安装插件。该问题已在1.10.1版中修复,但Airflow文档中插件的代码示例已损坏。
我编写了一个示例项目来使集成工作正常进行,您可以在此处进行检查:https://github.com/felipegasparini/airflow_plugin_rbac_test
但是简而言之,您需要:
使用以下方法从appbuilder正确导入BaseView:
从flask_appbuilder导入BaseView作为AppBuilderBaseView
将“测试”方法的名称更改为“列表”
设置template_folder属性以指向模板所在的位置。
类似这样的东西:
from airflow.plugins_manager import AirflowPlugin
from flask_appbuilder import BaseView as AppBuilderBaseView
class TestAppBuilderBaseView(AppBuilderBaseView):
template_folder = '/root/airflow/plugins/test_plugin/templates'
@expose("/")
def list(self):
return self.render_template("test.html", content="Hello galaxy!")
v_appbuilder_view = TestAppBuilderBaseView()
v_appbuilder_package = {"name": "Test View",
"category": "Test Plugin",
"view": v_appbuilder_view}
# Defining the plugin class
class AirflowTestPlugin(AirflowPlugin):
name = "test_plugin"
# operators = [PluginOperator]
# sensors = [PluginSensorOperator]
# hooks = [PluginHook]
# executors = [PluginExecutor]
# macros = [plugin_macro]
# admin_views = [v]
# flask_blueprints = [bp]
# menu_links = [ml]
appbuilder_views = [v_appbuilder_package]
# appbuilder_menu_items = [appbuilder_mitem]
答案 1 :(得分:0)
我也面临同样的问题。 在将模板文件夹包括在蓝图中之后,其选择了正确的文件夹,这是我的工作示例。
请保持如下所示的文件夹结构
Plugin
|_test_plugin
|_templates
|_test.html
test_plugin.py
from airflow.plugins_manager import AirflowPlugin
from flask import Blueprint
from flask_admin import BaseView, expose
from flask_admin.base import MenuLink
class TestView(BaseView):
@expose('/')
def test(self):
return self.render("test.html", content="Hello galaxy!")
v = TestView(category="Test Plugin", name="Test View")
blue_print_ = Blueprint("test_plugin",
__name__,
template_folder='templates')
class AirflowTestPlugin(AirflowPlugin):
name = "MenuLinks"
# operators = []
flask_blueprints = [blue_print_]
# hooks = []
# executors = []
admin_views = [v]
#appbuilder_views = [v_appbuilder_package]
答案 2 :(得分:0)
fgasparini的答案是正确的,但我还需要启用RBAC设置
rbac = True
在airflow.cfg
中,以使flask_appbuilder
顺畅地工作,否则菜单不会显示。