Airflow 如何在气流变量上强制使用Jinja模板?

Airflow 如何在气流变量上强制使用Jinja模板?,airflow,Airflow,比如:您可以对文档中标记为“templated”的每个参数使用Jinja模板。气流世界中的特定参数(例如,PythonOperator的某些参数)由气流自动模板化是有意义的。我想知道最好/正确的方法是获取非气流变量以进行模板化。我的特定用例类似于: 来自气流导入DAG 从afflow.operators.python_operator导入PythonOperator 从某处导入导出投票数据,导出查询数据 从其他地方导入ApiCaucus、ApiQuery dag=dag(“导出培训数据”, de

比如:
您可以对文档中标记为“templated”的每个参数使用Jinja模板。气流世界中的特定参数(例如,
PythonOperator
的某些参数)由气流自动模板化是有意义的。我想知道最好/正确的方法是获取非气流变量以进行模板化。我的特定用例类似于:

来自气流导入DAG
从afflow.operators.python_operator导入PythonOperator
从某处导入导出投票数据,导出查询数据
从其他地方导入ApiCaucus、ApiQuery
dag=dag(“导出培训数据”,
description=“将所有现役组织的训练数据导出到地面军事系统”,
计划时间间隔=无,
开始日期=日期时间(2018年3月26日),追赶时间=假)
主机=”http://api-00a.dev0.solvvy.co"
桶=”gcs://my-bucket-name/{{ds}}/“#我想把这个模板化
投票api=ApiCaucus.get投票api(主机)
querys\u api=apiquerys.get\u querys\u api(主机)
export\u votes=PythonOperator(task\u id=“export\u votes”,python\u callable=export\u votes\u data,
op_args=[BUCKET,vows_api],dag=dag)
export\u querys=PythonOperator(task\u id=“export\u querys”,python\u callable=export\u query\u data,
op_args=[BUCKET,querys_api,export_solutions.task_id],dag=dag,
提供(上下文=真)

PythonOperator的
提供上下文
参数将传递用于模板化的参数。发件人:

提供上下文(bool)–如果设置为true,气流将通过一组 可以在函数中使用的关键字参数。这套 Kwarg与您可以在jinja模板中使用的内容完全对应。 为此,您需要在函数头中定义**kwargs

通过向可调用对象提供上下文,您可以在函数中执行插值:

def your_callable(bucket, api, **kwargs):
  bucket = bucket.format(**kwargs)
  [...]
操作员的内部方法(执行/预执行/后执行,以及任何可以获取上下文的地方):

BUCKET = "gcs://my-bucket-name/{{ ds }}/" # I'd like this to get templated

jinja_context = context['ti'].get_template_context()
rendered_content = self.render_template('', BUCKET, jinja_context)

请注意,今天,从1.10.4开始,PythonOperator的op_参数已经被模板化。“{ds}}”应该自动为您替换。