zipped packages and in memory storage strategies
i agree with nick. there should be no python code in the tenant specific zip. to solve the memory issue i would cache most of the pages in the datastore. to serve them you don't need to have all tenants loaded in your instances. you might also wanna look in pre generating html views on save rather then on request.
i have a multitenant app with a zipped package for each tenant/client which contains the templates and handlers for the public site for each of them. right now i have under 50 tenants and its fine to keep the imported apps in memory after the first request to that specific clients domain.
this approach works well but i have to redeploy the app with the new clients zipped package every time i make changes and/or a new client gets added.
now im working to make it possible to upload those packages via web upload and store them into the blobstore. 
my concerns now are:

getting the packages from the blobstore is of course slower than importing a zipped package in the filesystem.
but this is not the biggest issue.  
how do i load/import a module that is not in the filesystem and has no path?
if every clients package is around 1mb its not a problem as long as the client base is low but what if it raises 
to 1k or even more? obviously there i dont have enough memory to store a few GB of data in memory. 
what is the best way to deal with this? 
if i use the instance memory to store the previously tenant package in memory how would 
invalidate the data in memory if there would be a newly uploaded package?

i would appreciate some thougts about how to deal this kind of situation.