Airflow 如何在模板中解析json字符串
可以在一个模板内解析JSON字符串吗 我有一个HttpSensor,它通过REST API监控作业,但作业id是上游任务的响应,上游任务标记了Airflow 如何在模板中解析json字符串,airflow,Airflow,可以在一个模板内解析JSON字符串吗 我有一个HttpSensor,它通过REST API监控作业,但作业id是上游任务的响应,上游任务标记了xcom\u push 但是,我想做如下操作,这段代码给出了错误jinja2.exceptions.UndefinedError:“json”是未定义的 t1 = SimpleHttpOperator( http_conn_id="s1", task_id="job", endpoint="some_url", method
xcom\u push
但是,我想做如下操作,这段代码给出了错误jinja2.exceptions.UndefinedError:“json”是未定义的
t1 = SimpleHttpOperator(
http_conn_id="s1",
task_id="job",
endpoint="some_url",
method='POST',
data=json.dumps({ "foo": "bar" }),
xcom_push=True,
dag=dag,
)
t2 = HttpSensor(
http_conn_id="s1",
task_id="finish_job",
endpoint="job/{{ json.loads(ti.xcom_pull(\"job\")).jobId }}",
response_check=lambda response: True if response.json().state == "complete" else False,
poke_interval=5,
dag=dag
)
t2.set_upstream(t1)
您可以使用参数向DAG添加自定义Jinja过滤器以解析json 将公开的筛选器字典 在你的jinja模板中。比如传球
dict(hello=lambda name:'hello%s'%name)
此参数允许
您可以在所有与之相关的jinja模板中{{'world'| hello}}
这只狗
但是,只编写自己的自定义JsonHttpOperator
(或者在之前解析JSON的SimpleHttpOperator
中添加一个标志)可能会更简洁,这样您就可以直接引用模板中的{{ti.xcom\u pull(“作业”)[“jobId”]
class JsonHttpOperator(SimpleHttpOperator):
def execute(self, context):
text = super(JsonHttpOperator, self).execute(context)
return json.loads(text)
或者,也可以通过这样做将
json
模块添加到模板中,这样json就可以在模板中使用了。不过,像Daniel所说的那样创建插件可能是一个更好的主意
dag = DAG(
'dagname',
default_args=default_args,
schedule_interval="@once",
user_defined_macros={
'json': json
}
)
然后
dag = DAG(
'dagname',
default_args=default_args,
schedule_interval="@once",
user_defined_macros={
'json': json
}
)
finish_job = HttpSensor(
task_id="finish_job",
endpoint="kue/job/{{ json.loads(ti.xcom_pull('job'))['jobId'] }}",
response_check=lambda response: True if response.json()['state'] == "complete" else False,
poke_interval=5,
dag=dag
)