我正在尝试使用Jinja模板将xcom中的一些json解析为字典。请注意,下面的Operator
和templated_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是否对模板中的所有内容进行字符串化处理?如果是,是否有办法不这样做?
答案 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模板具有的值具有相同的访问权限。