简体   繁体   中英

Access Xcom in EmailOperator of Airflow

I'm very new to Airflow and I'm facing some problems with Xcom and Jinja.

I have to do some Python elaborations and then pass the result to an EmailOperator in order to send it as the email body.

Seems that does not exist documentation about it, the only hint that I've found is this link and it is badly formed, doesn't work and it's badly commented. I think that it has to be done via Jinja, but I'm not getting how...

This is the tentative I'm working on, could someone please help me and explain me why this code is wrong and how to fix it?

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2020, 11, 7),
    'email': ['ciccio.pasticcio@noreply.it'],
    'email_on_failure': True,
    'email_on_retry': False,
    'retries': 0,
    'retry_delay': timedelta(minutes=5)
}

dag = DAG(
    'dg_daily_saint',
    default_args=default_args,
    schedule_interval='10 9 * * *')

task1 = PythonOperator(task_id="extract_daily_saint",
                                     python_callable=extractDailySaint,
                                     provide_context=True,
                                     dag=dag)


def html_output(**context):
    value=context['task_instance'].xcom_pull(task_ids='extract_daily_saint', key='saint')
    return "<h1>" + value + "</h1>"


EMAIL_CONTENT = """
    <b> {{ html_output(context) }}</b>
    """

mail = EmailOperator(
    task_id='mail',
    to='ciccio.pasticcio@noreply.it',
    subject='DataGovernance',
    html_content=EMAIL_CONTENT,
    provide_context=True,
    dag=dag)

task1 >> mail

Being stuck might be another issue but I see a little confusion about pusher and puller.

Pusher is the operator that push a parameter to another operator. Pusher needs xcom_push=True . For PythonOperator , a returned value will be pushed.

Puller is the operator receives the parameter from the pusher. Puller needs provide_context=True

Thus, in your example

task1 = PythonOperator(task_id="extract_daily_saint",
                       python_callable=extractDailySaint,
                       xcom_push=True,  # not provide_context
                       dag=dag)

Then in your puller, you can use macros directly in Jinja template.

mail = EmailOperator(
    task_id='mail',
    to='ciccio.pasticcio@noreply.it',
    subject='DataGovernance',
    html_content="<b><h1> {{ task_instance.xcom_pull(task_ids='extract_daily_saint') }} </h1></b>",
    provide_context=True,  # puller needs provide_context
    dag=dag)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM