We picked Tornado (tornadoweb.org) because it is lightweight and fast, especially on cold start, which is an app engine issue for low-traffic apps. It's even faster than webapp (!) because webapp loads the Django templating system.
We've been happy with Tornado, although it doesn't have as much support for some stuff (e.g., web forms). It does have a templating language which is just embedded python. I like having the power to have a reasonable "if" statement or "for" loop, even though most people believe that embedding complex logic in templates will produce spaghetti.
See also http://stackoverflow.com/questions/70913/which-python-framew... and http://www.quora.com/What-is-the-best-Python-Web-Framework-t...
I've used tipfy.org
I've worked with Django for 3 years, and in my opinion Django actually has a non-negligible learning curve. If you have to give up the benefits of the full-stack approach and of the Django ecosystem of pluggable apps, you might as well go with something simpler, such as Bottle or Flask, or choose a full-stack framework that officially supports GAE, such as web2py.
Flask, despite being a micro-framework, is extremely powerful. It's core is well-written and there's a lot of useful extensions out there (like Flask-WTF or Flask-Assets). Flask also works really well with Google App Engine (see example skeleton: https://github.com/kamalgill/flask-appengine-template; there's more on GitHub). With little effort you get WTForms and even Webassets support almost out of the box, in really elegant way.
Tornado will also do, since it's very similar to webapp and has very good templating system. However, since extensions ecosystem for Tornado is almost non-existent, one has to write more code to make up for it (e.g. integration with Webassets, management commands, OAuth support etc.).
There's also Tipfy, but I have absolutely no experience with it, so I can't vouch for it.
Docs: http://flask.pocoo.org/
Flask and Jinja2 make views and templates really easy, and the AppEngine data store fits well for the models.
It's basically a superset of webapp with some great additions and tweaks.
A big advantage of webapp2 is that you can use existing (and probably future) SDK libraries without adaptation. Many App Engine services (blobstore, mail handler, deferred etc) use handlers made for webapp. With webapp2 you get all those handlers working out of the box with extra benefits: webapp2 is a lot easier to extend and includes the most glaring webapp missing features.
Also, you can use all the examples from the App Engine documentation with it, since it is made to be compatible with webapp. And later you learn the new, extended features.
If you use nothing else, the extended routing functionality and lazy loading of handlers are big improvements and are pretty painless to implement.
http://martin.tecnodoc.com.ar/default/post/2011/05/25/21_bot...
In addition, we have a small home-grown framework ("glue") that holds it together, but it's probably only about 100-200 lines of code. The advantage is that we know it and can maintain/add features easily.
But then again we don't really need a low end CMS, which is what many of these other frameworks try to provide.
import app
class Index(app.request):
def get(self):
self.show('index')
app.run('/',Index)
No framework in the whole world can make coding in AppEngine that easy.The web2py author also admitted a few months back in the mailing list that google was paying him to test out the framework against GAE. So I think that means the GAE support would be production-ready at the very least.
(The inevitable restrictions imposed by BigTable still apply, see http://www.web2py.com/AlterEgo/default/show/138).
(apparently the documentation doesn't mention any datastore feature it doesn't support but the last time I checked it did not support at least transactions)
http://martin.tecnodoc.com.ar/default/post/2011/05/25/21_bot...
http://code.google.com/appengine/docs/java/datastore/queries...
web2py is underestimated IMO - give it a try.
Tornado