Airflow 如何在模板中解析json字符串

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

可以在一个模板内解析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='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
)