不支持简单的http操作符头值jinja模板

时间:2019-06-25 12:03:35

标签: jinja2 airflow

我试图使用我的自定义http运算符(扩展simpleHttpOperator)在我的http请求的标头值中使用模板。似乎仅在数据字段中支持模板。如何在标头字段中实现相同的功能。我想传递模板的授权标头。请在下面找到我的代码。



import airflow
from airflow import DAG
from airflow.configuration import conf
from airflow.operators.python_operator import PythonOperator
from airflow.operators.auth_plugins import SipAuthOperator
from airflow.operators.util_plugins import AuthUtility


DEFAULT_VERSION = '2.0'

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': airflow.utils.dates.days_ago(2),
    'email': ['airflow@example.com'],
    'email_on_failure': False,
    'email_on_retry': False

}

DAG_ID = 'test_dag'
dag = DAG(DAG_ID, default_args=default_args,
          schedule_interval=None,
          catchup=False)
dag.doc_md = __doc__

auth_endpoint = conf['auth_apis']['authenticate_end_point']

def inspect_params(**context):
    token = context['task_instance'].xcom_push(key='JWT_TOKEN',value='helloooo'
                                       )
    print(token)

test_operator = PythonOperator(dag=dag,task_id='init_api',
                                       python_callable=inspect_params,
                                       provide_context=True, )

# data={'token':'{{task_instance.xcom_pull(key=\'JWT_TOKEN\')}}'}
# {'Authorization':'Bearer '+'{{task_instance.xcom_pull(key=\'JWT_TOKEN\')}}'
http_operator = SipAuthOperator( dag=dag,task_id='authenticate_api',http_conn_id='auth_api',endpoint=auth_endpoint,headers={'token':'{{task_instance.xcom_pull(key=\'JWT_TOKEN\')}}'})

test_operator >> http_operator

标头值为{'token': "{{task_instance.xcom_pull(key='JWT_TOKEN')}}"},而不是所期望的。如果我在数据字段中输入相同的值,它将按预期工作。头文件支持jinja模板吗?任何解决此问题的方法?

1 个答案:

答案 0 :(得分:0)

运算符中的template_fields属性确定可以对哪些参数进行模板化。例如,在原始的SimpleHttpOperator中,您可以看到以下内容

class SimpleHttpOperator(BaseOperator):
    ...
    template_fields = ('endpoint', 'data',)
    ...

这就是为什么endpointdata受支持的模板字段的原因。同样,在您的自定义运算符中,您需要包含header

class SipAuthOperator(SimpleHttpOperator):
    ...
    template_fields = ('endpoint', 'data', 'header',)
    ...