I *think* it might be because xcom_pull only returns one element per task:
https://github.com/apache/incubator-airflow/blob/master/airflow/example_dags/example_xcom.py#L35 You're calling with just a single task_id, so I think you should be doing `for element in ...` rather than `for key, value in ...`. On Thu, Jun 16, 2016 at 11:51 AM, Jeremiah Lowin <jlo...@apache.org> wrote: > Or, I'm afraid my jinja-fu is sorely lacking and I'm not going to be much > help to you here... perhaps Maxime or one of the other devs is more > experienced with templates and can offer some advice? > > Apologies! > Jeremiah > > On Thu, Jun 16, 2016 at 2:40 AM Or Sher <or.sh...@gmail.com> wrote: > > > Thanks Jeremiah! > > > > Looking at the code it seems like get_many can return only many xcom > values > > from different task_ids and not different keys from the same task_id. > > But it doesn't really matter as I would really like to do the iteration > > somehow inside the template. > > I feel like building the template inside the previous python operator is > > kind of missing the whole point of templates as I can already create the > > whole "already rendered" email message at the same time. > > > > I tried pushing one big json xcom to reflect all of the tests, but now > > I'm struggling > > with iterating string json inside the template. > > The following template fails on the "for" line: > > VALIDATION_EMAIL_CONTENT = """ > > <b>Date:</b> {{ ds }}<br> > > <p> > > <table> > > {% for key, value in > > task_instance.xcom_pull(task_ids='data_validation_tests', > > key='tests_results') %} > > {{ key|string() }} > > {{ value|string() }} > > {% endfor %} > > .. > > .. > > > > File "<template>", line 5, in top-level template code > > ValueError: too many values to unpack > > > > I'm guessing it's because the xcom_pull returns a string but I didn't > > managed to cast it to a json yet.. > > > > On Wed, Jun 15, 2016 at 5:33 PM Jeremiah Lowin <jlo...@apache.org> > wrote: > > > > > Hi Or, > > > > > > There is support for pulling multiple XComs at once (see > XCom.get_many()) > > > but it won't be directly available inside a jinja template, where you > you > > > are typically calling ti.xcom_pull() and returning a single XCom at a > > time, > > > using a key you know in advance. > > > > > > I would suggest that you do this processing either inside your existing > > > PythonOperator or in a subsequent PythonOperator that calls > > XCom.get_many() > > > and produces the final template for your email operator. It is > > > theoretically possible for you to do this in your email template using > > > template macros, but I only have a basic knowledge of that (and it's a > > > convoluted process) so I don't want to give you bad advice. If you can > do > > > your preprocessing in your PythonOperator I think you will be happier, > > > especially because the result will be visible in the Airflow UI and > logs. > > > > > > Best, > > > Jeremiah > > > > > > On Wed, Jun 15, 2016 at 9:49 AM Or Sher <or.sh...@gmail.com> wrote: > > > > > > > Hi all, > > > > > > > > For the purpose of data validation tests I have two adjacent > operators: > > > > Python - Parsing predefined json of tests and saves the result as an > > xcom > > > > where each key is a test id. > > > > > > > > Email - I'd like to be able to iterate over all keys from the > previous > > > task > > > > inside the predefined email template so I won't need to change it > every > > > > time I change the tests json. > > > > > > > > It seems like it's not supported. Is that right? > > > > What are my choices? > > > > If I won't find anything else, I assume I can always use one key for > > all > > > of > > > > the tests combined into one json. > > > > > > > > > >