气流插件,启用RBAC的蓝图不起作用

时间:2018-12-10 07:13:29

标签: flask airflow

我们有一个基于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

对此有任何指导吗?。

在此先感谢
詹森

3 个答案:

答案 0 :(得分:2)

版本1.10.0发行时,存在一个错误,无法在新UI中正确安装插件。该问题已在1.10.1版中修复,但Airflow文档中插件的代码示例已损坏。

我编写了一个示例项目来使集成工作正常进行,您可以在此处进行检查:https://github.com/felipegasparini/airflow_plugin_rbac_test

但是简而言之,您需要:

  1. 使用以下方法从appbuilder正确导入BaseView:

    从flask_appbuilder导入BaseView作为AppBuilderBaseView

  2. 将“测试”方法的名称更改为“列表”

  3. 设置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

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顺畅地工作,否则菜单不会显示。