气流将Jinja模板作为字符串

时间:2018-11-26 07:33:49

标签: airflow apache-airflow-xcom

在Airflow中,我试图向我们介绍airflow中的jinja模板,但问题是它没有被解析,而是被当作字符串处理。请看我的代码 ``

from datetime import datetime

from airflow.operators.python_operator import PythonOperator
from airflow.models import DAG

def test_method(dag,network_id,schema_name):
    print "Schema_name in test_method", schema_name
    third_task = PythonOperator(
        task_id='first_task_' + network_id,
        provide_context=True,
        python_callable=print_context2,
        dag=dag)
    return third_task

dag = DAG('testing_xcoms_pull', description='Testing Xcoms',
          schedule_interval='0 12 * * *',
          start_date= datetime.today(),
          catchup=False)


def print_context(ds, **kwargs):
    return 'Returning from print_context'

def print_context2(ds, **kwargs):
    return 'Returning from print_context2'

def get_schema(ds, **kwargs):
    # Returning schema name based on network_id
    schema_name = "my_schema"
    return get_schema

first_task = PythonOperator(
    task_id='first_task',
    provide_context=True,
    python_callable=print_context,
    dag=dag)


second_task = PythonOperator(
    task_id='second_task',
    provide_context=True,
    python_callable=get_schema,
    dag=dag)

network_id = '{{ dag_run.conf["network_id"]}}'

first_task >> second_task >> test_method(
                    dag=dag,
                    network_id=network_id,
                    schema_name='{{ ti.xcom_pull("second_task")}}')

``

Dag创建失败,因为气流将'{{ dag_run.conf["network_id"]}}'当作字符串。谁能帮我解决我代码中的问题吗?

2 个答案:

答案 0 :(得分:0)

气流操作员具有一个名为template_fields的变量。通常在操作符类的顶部声明此变量,请在github代码库中检出任何操作符。

如果您要将Jinja模板语法传递到的字段不在template_fields列表中,则jinja语法将显示为字符串。

答案 1 :(得分:0)

boost::property_map<>对象及其定义代码不会在执行上下文中进行解析,而是根据Python加载时可用的环境进行解析。

用于在函数中定义namespace boost { // overriding the typedef to take the types from the BoostBase instead: template <typename Tag, typename... Args> struct property_map<MyGraph<Args...>, Tag> : property_map<typename MyGraph<Args...>::BoostBase, Tag> { }; } 的{​​{1}}变量在执行之前未进行模板化,由于没有执行活动,因此无法进行模板化。即使使用模板,您仍然需要有效的,静态的,非模板的template <typename WhateverGraph> void some_naive_user_function(WhateverGraph const& g, std::ostream& os) { // we don't know whether WhateverGraph is filtered or not, but we don't care print_graph(g, get(boost::vertex_index, g), os); } 值来实例化get(boost::vertex_index, g)对象。