我试图使用我的自定义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模板吗?任何解决此问题的方法?
答案 0 :(得分:0)
运算符中的template_fields
属性确定可以对哪些参数进行模板化。例如,在原始的SimpleHttpOperator中,您可以看到以下内容
class SimpleHttpOperator(BaseOperator):
...
template_fields = ('endpoint', 'data',)
...
这就是为什么endpoint
和data
受支持的模板字段的原因。同样,在您的自定义运算符中,您需要包含header
。
class SipAuthOperator(SimpleHttpOperator):
...
template_fields = ('endpoint', 'data', 'header',)
...