The reason is that google.appengine.ext.webapp.template.render does not use user custom TEMPLATE_DIRS . Instead, he invents his own TEMPLATE_DIRS byt, taking the directory of this template and using it in TEMPLATE_DIRS . This means that if you call render("foo/bar/fie") , it will use foo/bar as the directory for your template and look for files there.
Now the change from 0.96 to 1.2 means that the file search has switched from using os.path.join to using django.utils._os.safe_join , which does not allow you to exit the base directory using ../ .
I do not see the obvious path here. It looks like you should call render with the file directly in your templates directory, and not in a subdirectory.
source share