Python 在Airflow的EmailOperator中访问Xcom

Python 在Airflow的EmailOperator中访问Xcom,python,google-cloud-platform,jinja2,airflow,Python,Google Cloud Platform,Jinja2,Airflow,我对气流非常陌生,我在Xcom和Jinja方面遇到了一些问题 我必须对Python进行一些详细说明,然后将结果传递给EmailOperator,以便将其作为电子邮件正文发送 似乎不存在关于它的文档,我发现的唯一提示是,它的格式不好,不起作用,而且评论不好。 我认为这必须通过Jinja完成,但我不知道如何 这是我正在做的尝试,有人能帮我解释一下为什么这个代码是错误的,以及如何修复它吗 default_args = { 'owner': 'airflow', 'depends_on_

我对气流非常陌生,我在Xcom和Jinja方面遇到了一些问题

我必须对Python进行一些详细说明,然后将结果传递给EmailOperator,以便将其作为电子邮件正文发送

似乎不存在关于它的文档,我发现的唯一提示是,它的格式不好,不起作用,而且评论不好。 我认为这必须通过Jinja完成,但我不知道如何

这是我正在做的尝试,有人能帮我解释一下为什么这个代码是错误的,以及如何修复它吗

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
默认参数={
“所有者”:“气流”,
“依赖于过去”:False,
“开始日期”:日期时间(2020年11月7日),
“电子邮件”:[“ciccio”。pasticcio@noreply.it'],
“失败时发送电子邮件”:True,
“重试时发送电子邮件”:False,
“重试次数”:0,
“重试延迟”:时间增量(分钟=5)
}
dag=dag(
《圣徒日报》,
默认参数=默认参数,
附表(间隔时间=10 9***)
task1=PythonOperator(task\u id=“每天提取”,
python_callable=extractDailySaint,
提供上下文=True,
dag=dag)
def html_输出(**上下文):
value=context['task\u instance'].xcom\u pull(task\u id='extract\u daily\u saint',key='saint')
返回“”+值+“”
电子邮件_CONTENT=“”
{{html_输出(上下文)}
"""
mail=电子邮件接线员(
任务_id='mail',
给西西奥。pasticcio@noreply.it',
主题为“数据治理”,
html\u内容=电子邮件内容,
提供上下文=True,
dag=dag)
任务1>>邮件

被卡住可能是另一个问题,但我看到了关于推拉器的一些混乱

Pusher是将参数推送到另一个操作符的操作符。推送器需要
xcom\u push=True
。对于
PythonOperator
,将推送返回值

拉具是操作员从推具接收参数的装置。拉具需要
提供\u context=True

因此,在你的例子中

task1 = PythonOperator(task_id="extract_daily_saint",
                       python_callable=extractDailySaint,
                       xcom_push=True,  # not provide_context
                       dag=dag)
然后在拉具中,可以直接在Jinja模板中使用宏

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)
mail=EmailOperator(
任务_id='mail',
给西西奥。pasticcio@noreply.it',
主题为“数据治理”,
html_content=“{{task_instance.xcom_pull(task_id='extract_daily_saint')}”,
provide_context=True,#拉具者需要提供_context
dag=dag)

您能详细说明什么不起作用吗?您看到了什么错误?代码的哪一部分有问题?您好,谢谢您的回答!该问题与电子邮件内容变量的呈现有关。我不知道在运算符外部使用Xcom值的正确方法。我的DAG在电子邮件任务上处于运行状态达数分钟,然后我收到一个超时错误。如果我删除jinja部分并在电子邮件内容中使用静态文本,它将正常工作。谢谢,现在更清楚如何使用pusher和puller!