Airflow 气流-如何使EmailOperator html_内容动态化?
我正在寻找一种方法,允许动态设置给定EmailOperator任务发送的电子邮件的内容。理想情况下,我希望使电子邮件内容取决于xcom调用的结果,最好是通过html_content参数Airflow 气流-如何使EmailOperator html_内容动态化?,airflow,Airflow,我正在寻找一种方法,允许动态设置给定EmailOperator任务发送的电子邮件的内容。理想情况下,我希望使电子邮件内容取决于xcom调用的结果,最好是通过html_content参数 alert = EmailOperator( task_id=alertTaskID, to='please@dontreply.com', subject='Airflow processing report', html_content='raw content #2',
alert = EmailOperator(
task_id=alertTaskID,
to='please@dontreply.com',
subject='Airflow processing report',
html_content='raw content #2',
dag=dag
)
我注意到Airflow文档说xcom调用可以嵌入到模板中。也许有一种方法可以使用指定任务ID上的模板来制定xcom请求,然后将结果作为html_内容传递进来?谢谢我还是自己回答吧。事实证明,使用模板+xcom路由非常简单。此代码段在已定义dag的上下文中工作。它使用BashOperator而不是EmailOperator,因为它更容易测试
def pushparam(param, ds, **kwargs):
kwargs['ti'].xcom_push(key='specificKey', value=param)
return
loadxcom = PythonOperator(
task_id='loadxcom',
python_callable=pushparam,
provide_context=True,
op_args=['your_message_here'],
dag=dag)
template2 = """
echo "{{ params.my_param }}"
echo "{{ task_instance.xcom_pull(task_ids='loadxcom', key='specificKey') }}"
"""
t5 = BashOperator(
task_id='tt2',
bash_command=template2,
params={'my_param': 'PARAMETER1'},
dag=dag)
可以在命令行上使用以下内容进行测试:
airflow test dag_name loadxcom 2015-12-31
airflow test dag_name tt2 2015-12-31
我最终会使用EmailOperator进行测试,如果它不起作用,我会在这里添加一些东西…对于那些想要在EmailOperator中使用jinja模板的人,这里有一个
from airflow.operators.email_operator import EmailOperator
from datetime import timedelta, datetime
email_task = EmailOperator(
to='some@email.com',
task_id='email_task',
subject='Templated Subject: start_date {{ ds }}',
params={'content1': 'random'},
html_content="Templated Content: content1 - {{ params.content1 }} task_key - {{ task_instance_key_str }} test_mode - {{ test_mode }} task_owner - {{ task.owner}} hostname - {{ ti.hostname }}",
dag=dag)
您可以使用
airflow test dag_name email_task 2017-05-10
改用
PythonOperator
+send\u email
:
from airflow.operators import PythonOperator
from airflow.utils.email import send_email
def email_callback(**kwargs):
with open('/path/to.html') as f:
content = f.read()
send_email(
to=[
# emails
],
subject='subject',
html_content=content,
)
email_task = PythonOperator(
task_id='task_id',
python_callable=email_callback,
provide_context=True,
dag=dag,
)
你成功地让EmailOperator充满活力了吗?您使用了什么方法?我似乎无法在文件名中使用“{ds}”。有什么想法吗,伙计们/html_content=“模板化内容:日期:{{ds}}”应该可以使用