如何在 EmailOperator 任务的文件名中添加模板变量? (空气流动)

How to add template variable in the filename of an EmailOperator task? (Airflow)

我似乎无法让它工作。

我正在尝试每天发送一个给定的文件,其名称类似于 'file_{{ds_nodash}}.csv'。

问题是我似乎无法将此名称添加为文件名,因为它似乎无法使用。在电子邮件的文本或主题中完美无缺,而不是在名称上。

这里以dag为例:

local_file = 'file-{{ds_nodash}}.csv'

send_stats_csv = EmailOperator(
    task_id='send-stats-csv',
    to=['email@gmail.com'],
    subject='Subject - {{ ds }}',
    html_content='Here is the new file.',
    files=[local_file],
    dag=dag)

错误代码: 没有这样的文件或目录:u'file-{{ds_nodash}}.csv'

如果我按照给定的日期按字面意思写,它会完美无缺。

我哪里错了?我该怎么办?

如有任何帮助,我们将不胜感激。

谢谢。

P.D。从气流的文档中复制粘贴 - "The Airflow engine passes a few variables by default that are accessible in all templates"。 https://airflow.incubator.apache.org/code.html

如果我没理解错的话,这些变量在执行时是可以访问的,所以如果我正在执行dag,应该能找到文件吧?我已经尝试过测试任务或回填 dag,但都没有成功。

好吧,试了一下我发现 ds_nodash 是一个模板变量。可能你需要在 'ds_nodash' 之前和之后留出空格,它看起来像这样:'file-{{ ds_nodash }}.csv'

Airflow Operators 定义哪些字段是模板字段。对于 EmailOperator,只有主题和 html_content 字段被设置为模板。

class EmailOperator(BaseOperator):
    ...
    template_fields = ('subject', 'html_content')
    template_ext = ('.html',)

参见:https://airflow.incubator.apache.org/_modules/email_operator.html

来自 Airflow Gotcha 的页面(https://gtoonstra.github.io/etl-with-airflow/gotchas.html

Not all parameters in operators are templated, so you cannot use Jinja templates everywhere. The Jinja templates only work for those fields in operators where it’s listed in the template_fields...

要使其正常工作,您必须从 EmailOperator 派生一个新的 class 并添加文件数组的模板。