气流渲染的模板变成字符串

时间:2018-09-21 20:21:47

标签: python jinja2 airflow

我正在尝试使用Jinja模板将xcom中的一些json解析为字典。请注意,下面的Operatortemplated_field是伪代码。

def xcom_from_json(xcom):
    xcom_loaded = json.loads(xcom)
    logging.info(pformat(f'xcom loaded: {xcom_loaded}', indent=3))
    return xcom_loaded

PythonOperator(python_callable=some_callable,
           op_args=[f'{{{{ (ti.xcom_pull("{task_id}") | xcom_from_json)["data"]["stats"] }}}}'])

上面的方法几乎可行。在some_callable方法中,我得到了已解析的Jinja,但它以字符串化的dict而不是原始dict的形式出现。这没有任何意义,因为您可以在Jinja模板中看到遍历该结构作为命令。 jinja是否对模板中的所有内容进行字符串化处理?如果是,是否有办法不这样做?

1 个答案:

答案 0 :(得分:2)

渲染的jinja模板总是 返回一个字符串。相反,您可以做的是从python方法中获取XCom值。

def some_callable(task_id, **context):
    stats = json.loads(context['ti'].xcom_pull(task_id)['data']['stats'])

PythonOperator(
    ...
    python_callable=some_callable,  
    op_args=[f'{task_id}'],
    provide_context=True)

请注意,您必须提供上下文,这将使python方法对jinja模板具有的值具有相同的访问权限。