Full-stack frameworks
Django, TurboGears, and Pylons mostly have the feel of Lego blocks, where different apps can be used in different websites very easily, all using the prescribed tools for the database, network, etc. If you like any of the apps currently in development (say, Byteflow, Sphene Community Tools, or Flatpages for Django), then there's not really much work to do.
Of the three, Django was the first I tried, and I went insane looking for the most trivial of things, like code for the URL of the page that was being rendered. Django is well polished and it has good documentation, but it doesn't like letting you reach down to a lower level of abstraction. It's also accused of being monolithic and having an NIH attitude, although it's becoming more and more modular.
TurboGears is written over CherryPy, Pylons is written over Paste, and TurboGears 2 is being written over Pylons. Pylons and TurboGears have very similar philosophies: for the most part, they claim to use "best-of-breed" libraries. However, they were initially developed at different times, and the state of Python libraries changed considerably in between. Thus, both frameworks essentially provide glue around solid libraries, but they use different toolsets at for pretty much everything. A brief overview:
- TurboGears - CherryPy for HTTP, Genshi (XML-based) for templating, SqlObject (simpler) for persistence
- Pylons - Paste for HTTP, Mako (faster) for templating, SqlAlchemy (more powerful) for persistence
Paste and Pylons are architected entirely around WSGI. WSGI (links: Wikipedia, PEP 333, WSGI wiki is a low-level interface, essentially a powerful superset of CGI and its brethren. While most people acknowledge its usefulness to framework developers, there's a lot of controversy over its usefulness to webapp developers, which I won't link to here.
Of the two, Pylons is probably the better choice because it offers more modern components. The TurboGears community was divided a while ago; I'm not sure how they're doing right now, but it'll still be chaotic until the transition to TurboGears 2.
HTTP frameworks
CherryPy, Paste, and maybe web.py do lots of networking for you but little else. If you want to use Jinja2, Genshi, Mako, Cheetah, or any other templating engine, you'll have to integrate it yourself. And if you want to use SqlAlchemy, Storm, SqlObject, or Dejavu for databases, you'll have to integrate them yourself. The benefit is that the low-level data is right in front of you. For example, in CherryPy, getting the base of the URL, the list of cookies, and the list of headers is as simple as
cherrypy.request.base
cherrypy.request.cookie
cherrypy.request.headers
because CherryPy is so pythonic. The request
is just an object that has all those attributes. Similarly, response
is an object so you can set the client's cookies with statements like
cherrypy.response.cookie['cookieName'] = 'cookieValue'
cherrypy.response.cookie['cookieName']['expires'] = 3600
Paste (which I haven't used outside of Pylons) is slower and less pythonic, but it uses WSGI exclusively and is currently gaining momentum. The WSGI wars have simmered since CherryPy 3 was released in late 2006, adding better WSGI support; but the two design philosophies are still polar opposites.
Other frameworks
There's also Zope, the heavy-duty grandfather of Python frameworks, and Plone, a content management system that runs on top of it. I haven't used either one, but Zope is generally compared to Java web frameworks – good if you're looking for a reliable platform, but not so good for rapid development. Zope 3 has tremendously reduced the learning curve, but most Pythoneers have probably moved on.
There's also Twisted, a lower-level framework and server setup, and Nevow, another layer over Twisted. I don't know enough about them to say much more, though.
There really are a lot of great choices out there; for the vast majority of users, Django, Pylons, and CherryPy offer the best coverage, and I find myself going back and forth between them for each project. My personal preference is a custom setup with CherryPy, simply because I don't like the hierarchy and opaqueness that full-stack frameworks try to enforce. For you, CherryPy sounds like a good bet, too.