如何向Airflow变量传递值?Jinja模板渲染失败问题排查
解决Airflow Variable中Jinja模板未渲染的问题
问题核心
直接调用Variable.get()不会自动解析Jinja模板标签,且若你的advertiser_id等是本地Python变量而非Airflow全局变量,模板里的{{ var.* }}写法本身就不匹配变量来源。
解决方案分两种场景:
场景1:advertiser_id等是Airflow全局变量
如果这些值已经存在于Airflow Variables中,只需在获取变量时开启模板渲染:
payload_variable_string = Variable.get("payload_keyword", render_template=True) logging.info(payload_variable_string)
此时Airflow Variable里的模板保持{{ var.advertiser_id }}写法即可,开启render_template=True后,Airflow会自动替换对应的全局变量值。
场景2:advertiser_id等是Python本地变量(你的情况)
因为你提到这些变量是在API调用方法中声明的本地变量,需要手动用Jinja2渲染模板:
- 调整Airflow Variable中的模板:去掉
var.前缀,直接使用本地变量名:
{ "advertiserId": "{{ advertiser_id }}", "startDate": "{{ start_date }}", "endDate": "{{ end_date }}", "reportType": "reportType", "reportMetrics": [ // 你的指标列表 ] }
- 在代码中手动渲染模板:
from jinja2 import Template import json from airflow.models import Variable import logging # 本地声明的变量 advertiser_id = '24883' start_date = '2023-02-01' end_date = '2023-02-10' # 获取Airflow中存储的模板字符串 payload_template = Variable.get("payload_keyword") # 用本地变量渲染模板 rendered_payload_str = Template(payload_template).render( advertiser_id=advertiser_id, start_date=start_date, end_date=end_date ) # 转换为JSON对象(用于API POST请求) payload = json.loads(rendered_payload_str) logging.info(payload)
为什么原来的方法失效?
Variable.get()默认参数render_template=False,不会触发Jinja模板解析;- 模板中的
{{ var.advertiser_id }}是引用Airflow全局变量的语法,和你代码里的本地变量不是同一个对象,即使开启渲染也无法匹配到本地值。
内容的提问来源于stack exchange,提问作者shri-nik-8
相关产品推荐
相关产品推荐

