我正在尝试从REST API运行DAG并将一些参数传递给它。 DAG应该能够捕获参数并使用它。问题是我能够从REST API触发DAG,但DAG无法捕获传递的参数。有没有办法做到这一点?
我正在从REST API触发DAG,如下所示-它在--conf
中传递参数http://abcairflow.com:8090/admin/rest_api/api?api=trigger_dag\&dag_id=trigger_test_dag\&conf=%7B%22key%22%3A%2
如何捕获在调用的DAG中的conf值中传递的值。据我所知,conf应该使用URL编码的JSON格式数据。
DAG代码:`
def run_this_func(**kwargs):
print(kwargs)
run_this = PythonOperator(
task_id='run_this',
python_callable=run_this_func,
dag=dag
)`
答案 0 :(得分:2)
我不知道您可以使用HTTP GET触发DAG,但是我已经使用POST并遵循文档https://airflow.apache.org/api.html
成功地使用conf触发了例如触发dag“ trigger_test_dag”:
curl -X POST --data '"conf":"{\"key\":\"value\"}"' \
"http://abcairflow.com:8090/api/experimental/dags/trigger_test_dag/dag_runs"
请注意转义撇号,因为conf需要为字符串。我猜您可以对它进行基数64编码,然后在DAG中解码为字符串。
答案 1 :(得分:2)
传递的外部参数是dag_run
对象的一部分。可以按以下方式访问它们:
API请求
import requests
headers = {
'Cache-Control': 'no-cache',
'Content-Type': 'application/json',
}
data = '{"conf":"{\\"Key1\\":\\"Value1\\"}"}'
response = requests.post('http://localhost:8080/api/experimental/dags/<dag_id>/dag_runs', headers=headers, data=data)
DAG
def run_this_func(**context):
print("Received {} for key=message".format(context["dag_run"].conf))
run_this = PythonOperator(task_id="run_this", python_callable=run_this_func, provide_context=True, dag=dag)
答案 2 :(得分:0)
不幸的是,这不是一个有据可查的功能,但是有DAG触发了一个conf
集并使用它的目标DAG触发另一个DAG的示例。请参见example_trigger_controller_dag和example_trigger_target_dag。由操作员,REST API或CLI触发的DAG应该都以相同的方式传递conf
参数。
conf
在上下文内部是可访问的,因此您需要确保在使用provide_context=True
时传递PythonOperator
。
def run_this_func(**kwargs):
print(kwargs['conf'])
run_this = PythonOperator(
task_id='run_this',
python_callable=run_this_func,
dag=dag,
provide_context=True,
)
答案 3 :(得分:0)
这个需要一些挖掘,因为我想使用 conf 来创建一个动态工作流,而不仅仅是用于其他操作符。在整个 DAG 中使用 conf 参数:
args = {"owner": "me", "depends_on_past": False}
with DAG(
dag_id="my_dag",
default_args=args
schedule_interval="@daily",
start_date=dats_ago(1)
) as dag
conf = dag.get_dagrun(execution_date=dag.get_latest_execution_date()).conf
所以如果你在 conf 中传递的参数是
{"table_names": ["table1", "table2", "table3"]}
您可以通过执行访问表名列表
table_names = conf["tables_names"]