It's just that I didn't put entire code block here. This statement resides inside a for block as
for i,item in enumerate(data.keys()): so clearly i and item are available in the scope (this code works well with rocket server and local dev_appserver.py and problem is only when I upload it to GAE) assuming following is valid in view {{ for row in result: key = row.lang.full+' <'+row.lang.short+'>' if not data.has_key(key): data[key] = [] pass data[key].append(LOAD(c = 'default', f = 'briefings.load', args = [row.id], ajax=False)) data['All Languages'].append(LOAD(c = 'default', f = 'briefings.load', args = [row.id], ajax=False)) pass for i,item in enumerate(data.keys()): if item == 'All Languages': continue options.append(LI(A(item, _href = 'tab-'+str(i)))) items.append(DIV(DIV(*[data[item]], _id = 'wrap'), _id = 'ui-tabs-'+str(i))) pass options.append(LI(A(T('All Languages'), _href = 'tab-'+str(i+1)))) items.append(DIV(DIV(data['All Languages'], _id = 'wrap'), _id = 'ui-tabs-'+str(i+1))) }}