*******************************
  HOWTO Use Python in the web
*******************************

:Author: Marek Kubica

.. topic:: Abstract

   This document shows how Python fits into the web.  It presents some ways
   to integrate Python with a web server, and general practices useful for
   developing web sites.


Programming for the Web has become a hot topic since the rise of "Web 2.0",
which focuses on user-generated content on web sites.  It has always been
possible to use Python for creating web sites, but it was a rather tedious task.
Therefore, many frameworks and helper tools have been created to assist
developers in creating faster and more robust sites.  This HOWTO describes
some of the methods used to combine Python with a web server to create
dynamic content.  It is not meant as a complete introduction, as this topic is
far too broad to be covered in one single document.  However, a short overview
of the most popular libraries is provided.

.. seealso::

   While this HOWTO tries to give an overview of Python in the web, it cannot
   always be as up to date as desired.  Web development in Python is rapidly
   moving forward, so the wiki page on `Web Programming
   <http://wiki.python.org/moin/WebProgramming>`_ may be more in sync with
   recent development.


The Low-Level View
==================

When a user enters a web site, their browser makes a connection to the site's
web server (this is called the *request*).  The server looks up the file in the
file system and sends it back to the user's browser, which displays it (this is
the *response*).  This is roughly how the underlying protocol, HTTP, works.

Dynamic web sites are not based on files in the file system, but rather on
programs which are run by the web server when a request comes in, and which
*generate* the content that is returned to the user.  They can do all sorts of
useful things, like display the postings of a bulletin board, show your email,
configure software, or just display the current time.  These programs can be
written in any programming language the server supports.  Since most servers
support Python, it is easy to use Python to create dynamic web sites.

Most HTTP servers are written in C or C++, so they cannot execute Python code
directly -- a bridge is needed between the server and the program.  These
bridges, or rather interfaces, define how programs interact with the server.
There have been numerous attempts to create the best possible interface, but
there are only a few worth mentioning.

Not every web server supports every interface.  Many web servers only support
old, now-obsolete interfaces; however, they can often be extended using
third-party modules to support newer ones.


Common Gateway Interface
------------------------

This interface, most commonly referred to as "CGI", is the oldest, and is
supported by nearly every web server out of the box.  Programs using CGI to
communicate with their web server need to be started by the server for every
request.  So, every request starts a new Python interpreter -- which takes some
time to start up -- thus making the whole interface only usable for low load
situations.

The upside of CGI is that it is simple -- writing a Python program which uses
CGI is a matter of about three lines of code.  This simplicity comes at a
price: it does very few things to help the developer.

Writing CGI programs, while still possible, is no longer recommended.  With
:ref:`WSGI <WSGI>`, a topic covered later in this document, it is possible to write
programs that emulate CGI, so they can be run as CGI if no better option is
available.

.. seealso::

   The Python standard library includes some modules that are helpful for
   creating plain CGI programs:

   * :mod:`cgi` -- Handling of user input in CGI scripts
   * :mod:`cgitb` -- Displays nice tracebacks when errors happen in CGI
     applications, instead of presenting a "500 Internal Server Error" message

   The Python wiki features a page on `CGI scripts
   <http://wiki.python.org/moin/CgiScripts>`_ with some additional information
   about CGI in Python.


Simple script for testing CGI
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

To test whether your web server works with CGI, you can use this short and
simple CGI program::

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-

    # enable debugging
    import cgitb
    cgitb.enable()

    print("Content-Type: text/plain;charset=utf-8")
    print()

    print("Hello World!")

Depending on your web server configuration, you may need to save this code with
a ``.py`` or ``.cgi`` extension.  Additionally, this file may also need to be
in a ``cgi-bin`` folder, for security reasons.

You might wonder what the ``cgitb`` line is about.  This line makes it possible
to display a nice traceback instead of just crashing and displaying an "Internal
Server Error" in the user's browser.  This is useful for debugging, but it might
risk exposing some confidential data to the user.  You should not use ``cgitb``
in production code for this reason.  You should *always* catch exceptions, and
display proper error pages -- end-users don't like to see nondescript "Internal
Server Errors" in their browsers.


Setting up CGI on your own server
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If you don't have your own web server, this does not apply to you.  You can
check whether it works as-is, and if not you will need to talk to the
administrator of your web server. If it is a big host, you can try filing a
ticket asking for Python support.

If you are your own administrator or want to set up CGI for testing purposes on
your own computers, you have to configure it by yourself.  There is no single
way to configure CGI, as there are many web servers with different
configuration options.  Currently the most widely used free web server is
`Apache HTTPd <http://httpd.apache.org/>`_, or Apache for short. Apache can be
easily installed on nearly every system using the system's package management
tool.  `lighttpd <http://www.lighttpd.net>`_ is another alternative and is
said to have better performance.  On many systems this server can also be
installed using the package management tool, so manually compiling the web
server may not be needed.

* On Apache you can take a look at the `Dynamic Content with CGI
  <http://httpd.apache.org/docs/2.2/howto/cgi.html>`_ tutorial, where everything
  is described.  Most of the time it is enough just to set ``+ExecCGI``.  The
  tutorial also describes the most common gotchas that might arise.

* On lighttpd you need to use the `CGI module
  <http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModCGI>`_\ , which can be configured
  in a straightforward way.  It boils down to setting ``cgi.assign`` properly.


Common problems with CGI scripts
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Using CGI sometimes leads to small annoyances while trying to get these
scripts to run.  Sometimes a seemingly correct script does not work as
expected, the cause being some small hidden problem that's difficult to spot.

Some of these potential problems are:

* The Python script is not marked as executable.  When CGI scripts are not
  executable most web servers will let the user download it, instead of
  running it and sending the output to the user.  For CGI scripts to run
  properly on Unix-like operating systems, the ``+x`` bit needs to be set.
  Using ``chmod a+x your_script.py`` may solve this problem.

* On a Unix-like system, The line endings in the program file must be Unix
  style line endings.  This is important because the web server checks the
  first line of the script (called shebang) and tries to run the program
  specified there.  It gets easily confused by Windows line endings (Carriage
  Return & Line Feed, also called CRLF), so you have to convert the file to
  Unix line endings (only Line Feed, LF).  This can be done automatically by
  uploading the file via FTP in text mode instead of binary mode, but the
  preferred way is just telling your editor to save the files with Unix line
  endings.  Most editors support this.

* Your web server must be able to read the file, and you need to make sure the
  permissions are correct.  On unix-like systems, the server often runs as user
  and group ``www-data``, so it might be worth a try to change the file
  ownership, or making the file world readable by using ``chmod a+r
  your_script.py``.

* The web server must know that the file you're trying to access is a CGI script.
  Check the configuration of your web server, as it may be configured
  to expect a specific file extension for CGI scripts.

* On Unix-like systems, the path to the interpreter in the shebang
  (``#!/usr/bin/env python``) must be correct.  This line calls
  ``/usr/bin/env`` to find Python, but it will fail if there is no
  ``/usr/bin/env``, or if Python is not in the web server's path.  If you know
  where your Python is installed, you can also use that full path.  The
  commands ``whereis python`` and ``type -p python`` could help you find
  where it is installed.  Once you know the path, you can change the shebang
  accordingly: ``#!/usr/bin/python``.

* The file must not contain a BOM (Byte Order Mark). The BOM is meant for
  determining the byte order of UTF-16 and UTF-32 encodings, but some editors
  write this also into UTF-8 files.  The BOM interferes with the shebang line,
  so be sure to tell your editor not to write the BOM.

* If the web server is using :ref:`mod-python`, ``mod_python`` may be having
  problems.  ``mod_python`` is able to handle CGI scripts by itself, but it can
  also be a source of issues.


.. _mod-python:

mod_python
----------

People coming from PHP often find it hard to grasp how to use Python in the web.
Their first thought is mostly `mod_python <http://www.modpython.org/>`_\ ,
because they think that this is the equivalent to ``mod_php``.  Actually, there
are many differences.  What ``mod_python`` does is embed the interpreter into
the Apache process, thus speeding up requests by not having to start a Python
interpreter for each request.  On the other hand, it is not "Python intermixed
with HTML" in the way that PHP is often intermixed with HTML. The Python
equivalent of that is a template engine.  ``mod_python`` itself is much more
powerful and provides more access to Apache internals.  It can emulate CGI,
work in a "Python Server Pages" mode (similar to JSP) which is "HTML
intermingled with Python", and it has a "Publisher" which designates one file
to accept all requests and decide what to do with them.

``mod_python`` does have some problems.  Unlike the PHP interpreter, the Python
interpreter uses caching when executing files, so changes to a file will
require the web server to be restarted.  Another problem is the basic concept
-- Apache starts child processes to handle the requests, and unfortunately
every child process needs to load the whole Python interpreter even if it does
not use it.  This makes the whole web server slower.  Another problem is that,
because ``mod_python`` is linked against a specific version of ``libpython``,
it is not possible to switch from an older version to a newer (e.g. 2.4 to 2.5)
without recompiling ``mod_python``.  ``mod_python`` is also bound to the Apache
web server, so programs written for ``mod_python`` cannot easily run on other
web servers.

These are the reasons why ``mod_python`` should be avoided when writing new
programs.  In some circumstances it still might be a good idea to use
``mod_python`` for deployment, but WSGI makes it possible to run WSGI programs
under ``mod_python`` as well.


FastCGI and SCGI
----------------

FastCGI and SCGI try to solve the performance problem of CGI in another way.
Instead of embedding the interpreter into the web server, they create
long-running background processes. There is still a module in the web server
which makes it possible for the web server to "speak" with the background
process.  As the background process is independent of the server, it can be
written in any language, including Python.  The language just needs to have a
library which handles the communication with the webserver.

The difference between FastCGI and SCGI is very small, as SCGI is essentially
just a "simpler FastCGI".  As the web server support for SCGI is limited,
most people use FastCGI instead, which works the same way.  Almost everything
that applies to SCGI also applies to FastCGI as well, so we'll only cover
the latter.

These days, FastCGI is never used directly.  Just like ``mod_python``, it is only
used for the deployment of WSGI applications.

.. seealso::

   * `FastCGI, SCGI, and Apache: Background and Future
     <http://www.vmunix.com/mark/blog/archives/2006/01/02/fastcgi-scgi-and-apache-background-and-future/>`_
     is a discussion on why the concept of FastCGI and SCGI is better that that
     of mod_python.


Setting up FastCGI
^^^^^^^^^^^^^^^^^^

Each web server requires a specific module.

* Apache has both `mod_fastcgi <http://www.fastcgi.com/drupal/>`_ and `mod_fcgid
  <http://fastcgi.coremail.cn/>`_.  ``mod_fastcgi`` is the original one, but it
  has some licensing issues, which is why it is sometimes considered non-free.
  ``mod_fcgid`` is a smaller, compatible alternative.  One of these modules needs
  to be loaded by Apache.

* lighttpd ships its own `FastCGI module
  <http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModFastCGI>`_ as well as an
  `SCGI module <http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModSCGI>`_.

* `nginx <http://nginx.org/>`_ also supports `FastCGI
  <http://wiki.nginx.org/NginxSimplePythonFCGI>`_.

Once you have installed and configured the module, you can test it with the
following WSGI-application::

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-

    import sys, os
    from cgi import escape
    from flup.server.fcgi import WSGIServer

    def app(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])

        yield '<h1>FastCGI Environment</h1>'
        yield '<table>'
        for k, v in sorted(environ.items()):
             yield '<tr><th>{0}</th><td>{1}</td></tr>'.format(
                 escape(k), escape(v))
        yield '</table>'

    WSGIServer(app).run()

This is a simple WSGI application, but you need to install `flup
<http://pypi.python.org/pypi/flup/1.0>`_ first, as flup handles the low level
FastCGI access.

.. seealso::

   There is some documentation on `setting up Django with FastCGI
   <http://docs.djangoproject.com/en/dev/howto/deployment/fastcgi/>`_, most of
   which can be reused for other WSGI-compliant frameworks and libraries.
   Only the ``manage.py`` part has to be changed, the example used here can be
   used instead.  Django does more or less the exact same thing.


mod_wsgi
--------

`mod_wsgi <http://code.google.com/p/modwsgi/>`_ is an attempt to get rid of the
low level gateways.  Given that FastCGI, SCGI, and mod_python are mostly used to
deploy WSGI applications, mod_wsgi was started to directly embed WSGI applications
into the Apache web server. mod_wsgi is specifically designed to host WSGI
applications.  It makes the deployment of WSGI applications much easier than
deployment using other low level methods, which need glue code.  The downside
is that mod_wsgi is limited to the Apache web server; other servers would need
their own implementations of mod_wsgi.

mod_wsgi supports two modes: embedded mode, in which it integrates with the
Apache process, and daemon mode, which is more FastCGI-like.  Unlike FastCGI,
mod_wsgi handles the worker-processes by itself, which makes administration
easier.


.. _WSGI:

Step back: WSGI
===============

WSGI has already been mentioned several times, so it has to be something
important.  In fact it really is, and now it is time to explain it.

The *Web Server Gateway Interface*,  or WSGI for short, is defined in
:pep:`333` and is currently the best way to do Python web programming.  While
it is great for programmers writing frameworks, a normal web developer does not
need to get in direct contact with it.  When choosing a framework for web
development it is a good idea to choose one which supports WSGI.

The big benefit of WSGI is the unification of the application programming
interface.  When your program is compatible with WSGI -- which at the outer
level means that the framework you are using has support for WSGI -- your
program can be deployed via any web server interface for which there are WSGI
wrappers.  You do not need to care about whether the application user uses
mod_python or FastCGI or mod_wsgi -- with WSGI your application will work on
any gateway interface.  The Python standard library contains its own WSGI
server, :mod:`wsgiref`, which is a small web server that can be used for
testing.

A really great WSGI feature is middleware.  Middleware is a layer around your
program which can add various functionality to it.  There is quite a bit of
`middleware <http://wsgi.org/wsgi/Middleware_and_Utilities>`_ already
available.  For example, instead of writing your own session management (HTTP
is a stateless protocol, so to associate multiple HTTP requests with a single
user your application must create and manage such state via a session), you can
just download middleware which does that, plug it in, and get on with coding
the unique parts of your application.  The same thing with compression -- there
is existing middleware which handles compressing your HTML using gzip to save
on your server's bandwidth.  Authentication is another a problem easily solved
using existing middleware.

Although WSGI may seem complex, the initial phase of learning can be very
rewarding because WSGI and the associated middleware already have solutions to
many problems that might arise while developing web sites.


WSGI Servers
------------

The code that is used to connect to various low level gateways like CGI or
mod_python is called a *WSGI server*.  One of these servers is ``flup``, which
supports FastCGI and SCGI, as well as `AJP
<http://en.wikipedia.org/wiki/Apache_JServ_Protocol>`_.  Some of these servers
are written in Python, as ``flup`` is, but there also exist others which are
written in C and can be used as drop-in replacements.

There are many servers already available, so a Python web application
can be deployed nearly anywhere.  This is one big advantage that Python has
compared with other web technologies.

.. seealso::

   A good overview of WSGI-related code can be found in the `WSGI wiki
   <http://wsgi.org/wsgi>`_, which contains an extensive list of `WSGI servers
   <http://wsgi.org/wsgi/Servers>`_ which can be used by *any* application
   supporting WSGI.

   You might be interested in some WSGI-supporting modules already contained in
   the standard library, namely:

   * :mod:`wsgiref` -- some tiny utilities and servers for WSGI


Case study: MoinMoin
--------------------

What does WSGI give the web application developer?  Let's take a look at
an application that's been around for a while, which was written in
Python without using WSGI.

One of the most widely used wiki software packages is `MoinMoin
<http://moinmo.in/>`_.  It was created in 2000, so it predates WSGI by about
three years.  Older versions needed separate code to run on CGI, mod_python,
FastCGI and standalone.

It now includes support for WSGI.  Using WSGI, it is possible to deploy
MoinMoin on any WSGI compliant server, with no additional glue code.
Unlike the pre-WSGI versions, this could include WSGI servers that the
authors of MoinMoin know nothing about.


Model-View-Controller
=====================

The term *MVC* is often encountered in statements such as "framework *foo*
supports MVC".  MVC is more about the overall organization of code, rather than
any particular API.  Many web frameworks use this model to help the developer
bring structure to their program.  Bigger web applications can have lots of
code, so it is a good idea to have an effective structure right from the beginning.
That way, even users of other frameworks (or even other languages, since MVC is
not Python-specific) can easily understand the code, given that they are
already familiar with the MVC structure.

MVC stands for three components:

* The *model*.  This is the data that will be displayed and modified.  In
  Python frameworks, this component is often represented by the classes used by
  an object-relational mapper.

* The *view*.  This component's job is to display the data of the model to the
  user.  Typically this component is implemented via templates.

* The *controller*.  This is the layer between the user and the model.  The
  controller reacts to user actions (like opening some specific URL), tells
  the model to modify the data if necessary, and tells the view code what to
  display,

While one might think that MVC is a complex design pattern, in fact it is not.
It is used in Python because it has turned out to be useful for creating clean,
maintainable web sites.

.. note::

   While not all Python frameworks explicitly support MVC, it is often trivial
   to create a web site which uses the MVC pattern by separating the data logic
   (the model) from the user interaction logic (the controller) and the
   templates (the view).  That's why it is important not to write unnecessary
   Python code in the templates -- it works against the MVC model and creates
   chaos in the code base, making it harder to understand and modify.

.. seealso::

   The English Wikipedia has an article about the `Model-View-Controller pattern
   <http://en.wikipedia.org/wiki/Model-view-controller>`_.  It includes a long
   list of web frameworks for various programming languages.


Ingredients for Websites
========================

Websites are complex constructs, so tools have been created to help web
developers make their code easier to write and more maintainable.  Tools like
these exist for all web frameworks in all languages.  Developers are not forced
to use these tools, and often there is no "best" tool.  It is worth learning
about the available tools because they can greatly simplify the process of
developing a web site.


.. seealso::

   There are far more components than can be presented here.  The Python wiki
   has a page about these components, called
   `Web Components <http://wiki.python.org/moin/WebComponents>`_.


Templates
---------

Mixing of HTML and Python code is made possible by a few libraries.  While
convenient at first, it leads to horribly unmaintainable code.  That's why
templates exist.  Templates are, in the simplest case, just HTML files with
placeholders.  The HTML is sent to the user's browser after filling in the
placeholders.

Python already includes a way to build simple templates::

    # a simple template
    template = "<html><body><h1>Hello {who}!</h1></body></html>"
    print(template.format(who="Reader"))

To generate complex HTML based on non-trivial model data, conditional
and looping constructs like Python's *for* and *if* are generally needed.
*Template engines* support templates of this complexity.

There are a lot of template engines available for Python which can be used with
or without a `framework`_.  Some of these define a plain-text programming
language which is easy to learn, partly because it is limited in scope.
Others use XML, and the template output is guaranteed to be always be valid
XML.  There are many other variations.

Some `frameworks`_ ship their own template engine or recommend one in
particular.  In the absence of a reason to use a different template engine,
using the one provided by or recommended by the framework is a good idea.

Popular template engines include:

   * `Mako <http://www.makotemplates.org/>`_
   * `Genshi <http://genshi.edgewall.org/>`_
   * `Jinja <http://jinja.pocoo.org/2/>`_

.. seealso::

   There are many template engines competing for attention, becuase it is
   pretty easy to create them in Python.  The page `Templating
   <http://wiki.python.org/moin/Templating>`_ in the wiki lists a big,
   ever-growing number of these.  The three listed above are considered "second
   generation" template engines and are a good place to start.


Data persistence
----------------

*Data persistence*, while sounding very complicated, is just about storing data.
This data might be the text of blog entries, the postings on a bulletin board or
the text of a wiki page.  There are, of course, a number of different ways to store
information on a web server.

Often, relational database engines like `MySQL <http://www.mysql.com/>`_ or
`PostgreSQL <http://www.postgresql.org/>`_ are used because of their good
performance when handling very large databases consisting of millions of
entries.  There is also a small database engine called `SQLite
<http://www.sqlite.org/>`_, which is bundled with Python in the :mod:`sqlite3`
module, and which uses only one file.  It has no other dependencies.  For
smaller sites SQLite is just enough.

Relational databases are *queried* using a language called `SQL
<http://en.wikipedia.org/wiki/SQL>`_.  Python programmers in general do not
like SQL too much, as they prefer to work with objects.  It is possible to save
Python objects into a database using a technology called `ORM
<http://en.wikipedia.org/wiki/Object-relational_mapping>`_ (Object Relational
Mapping).  ORM translates all object-oriented access into SQL code under the
hood, so the developer does not need to think about it.  Most `frameworks`_ use
ORMs, and it works quite well.

A second possibility is storing data in normal, plain text files (some
times called "flat files").  This is very easy for simple sites,
but can be difficult to get right if the web site is performing many
updates to the stored data.

A third possibility are object oriented databases (also called "object
databases").  These databases store the object data in a form that closely
parallels the way the objects are structured in memory during program
execution.  (By contrast, ORMs store the object data as rows of data in tables
and relations between those rows.)  Storing the objects directly has the
advantage that nearly all objects can be saved in a straightforward way, unlike
in relational databases where some objects are very hard to represent.

`Frameworks`_ often give hints on which data storage method to choose.  It is
usually a good idea to stick to the data store recommended by the framework
unless the application has special requirements better satisfied by an
alternate storage mechanism.

.. seealso::

   * `Persistence Tools <http://wiki.python.org/moin/PersistenceTools>`_ lists
     possibilities on how to save data in the file system.  Some of these
     modules are part of the standard library

   * `Database Programming <http://wiki.python.org/moin/DatabaseProgramming>`_
     helps with choosing a method for saving data

   * `SQLAlchemy <http://www.sqlalchemy.org/>`_, the most powerful OR-Mapper
     for Python, and `Elixir <http://elixir.ematia.de/>`_, which makes
     SQLAlchemy easier to use

   * `SQLObject <http://www.sqlobject.org/>`_, another popular OR-Mapper

   * `ZODB <https://launchpad.net/zodb>`_ and `Durus
     <http://www.mems-exchange.org/software/durus/>`_, two object oriented
     databases


.. _framework:

Frameworks
==========

The process of creating code to run web sites involves writing code to provide
various services.  The code to provide a particular service often works the
same way regardless of the complexity or purpose of the web site in question.
Abstracting these common solutions into reusable code produces what are called
"frameworks" for web development.  Perhaps the most well-known framework for
web development is Ruby on Rails, but Python has its own frameworks.  Some of
these were partly inspired by Rails, or borrowed ideas from Rails, but many
existed a long time before Rails.

Originally Python web frameworks tended to incorporate all of the services
needed to develop web sites as a giant, integrated set of tools.  No two web
frameworks were interoperable:  a program developed for one could not be
deployed on a different one without considerable re-engineering work.  This led
to the development of "minimalist" web frameworks that provided just the tools
to communicate between the Python code and the http protocol, with all other
services to be added on top via separate components.  Some ad hoc standards
were developed that allowed for limited interoperability between frameworks,
such as a standard that allowed different template engines to be used
interchangeably.

Since the advent of WSGI, the Python web framework world has been evolving
toward interoperability based on the WSGI standard.  Now many web frameworks,
whether "full stack" (providing all the tools one needs to deploy the most
complex web sites) or minimalist, or anything in between, are built from
collections of reusable components that can be used with more than one
framework.

The majority of users will probably want to select a "full stack" framework
that has an active community.  These frameworks tend to be well documented,
and provide the easiest path to producing a fully functional web site in
minimal time.


Some notable frameworks
-----------------------

There are an incredible number of frameworks, so they cannot all be covered
here.  Instead we will briefly touch on some of the most popular.


Django
^^^^^^

`Django <http://www.djangoproject.com/>`_ is a framework consisting of several
tightly coupled elements which were written from scratch and work together very
well.  It includes an ORM which is quite powerful while being simple to use,
and has a great online administration interface which makes it possible to edit
the data in the database with a browser.  The template engine is text-based and
is designed to be usable for page designers who cannot write Python.  It
supports template inheritance and filters (which work like Unix pipes).  Django
has many handy features bundled, such as creation of RSS feeds or generic views,
which make it possible to create web sites almost without writing any Python code.

It has a big, international community, the members of which have created many
web sites.  There are also a lot of add-on projects which extend Django's normal
functionality.  This is partly due to Django's well written `online
documentation <http://docs.djangoproject.com/>`_ and the `Django book
<http://www.djangobook.com/>`_.


.. note::

   Although Django is an MVC-style framework, it names the elements
   differently, which is described in the `Django FAQ
   <http://docs.djangoproject.com/en/dev/faq/general/#django-appears-to-be-a-mvc-framework-but-you-call-the-controller-the-view-and-the-view-the-template-how-come-you-don-t-use-the-standard-names>`_.


TurboGears
^^^^^^^^^^

Another popular web framework for Python is `TurboGears
<http://www.turbogears.org/>`_.  TurboGears takes the approach of using already
existing components and combining them with glue code to create a seamless
experience.  TurboGears gives the user flexibility in choosing components. For
example the ORM and template engine can be changed to use packages different
from those used by default.

The documentation can be found in the `TurboGears wiki
<http://docs.turbogears.org/>`_, where links to screencasts can be found.
TurboGears has also an active user community which can respond to most related
questions.  There is also a `TurboGears book <http://turbogearsbook.com/>`_
published, which is a good starting point.

The newest version of TurboGears, version 2.0, moves even further in direction
of WSGI support and a component-based architecture.  TurboGears 2 is based on
the WSGI stack of another popular component-based web framework, `Pylons
<http://pylonshq.com/>`_.


Zope
^^^^

The Zope framework is one of the "old original" frameworks.  Its current
incarnation in Zope2 is a tightly integrated full-stack framework.  One of its
most interesting feature is its tight integration with a powerful object
database called the `ZODB <https://launchpad.net/zodb>`_ (Zope Object Database).
Because of its highly integrated nature, Zope wound up in a somewhat isolated
ecosystem:  code written for Zope wasn't very usable outside of Zope, and
vice-versa.  To solve this problem the Zope 3 effort was started.  Zope 3
re-engineers Zope as a set of more cleanly isolated components.  This effort
was started before the advent of the WSGI standard, but there is WSGI support
for Zope 3 from the `Repoze <http://repoze.org/>`_ project.  Zope components
have many years of production use behind them, and the Zope 3 project gives
access to these components to the wider Python community.  There is even a
separate framework based on the Zope components: `Grok
<http://grok.zope.org/>`_.

Zope is also the infrastructure used by the `Plone <http://plone.org/>`_ content
management system, one of the most powerful and popular content management
systems available.


Other notable frameworks
^^^^^^^^^^^^^^^^^^^^^^^^

Of course these are not the only frameworks that are available.  There are
many other frameworks worth mentioning.

Another framework that's already been mentioned is `Pylons`_.  Pylons is much
like TurboGears, but with an even stronger emphasis on flexibility, which comes
at the cost of being more difficult to use.  Nearly every component can be
exchanged, which makes it necessary to use the documentation of every single
component, of which there are many.  Pylons builds upon `Paste
<http://pythonpaste.org/>`_, an extensive set of tools which are handy for WSGI.

And that's still not everything.  The most up-to-date information can always be
found in the Python wiki.

.. seealso::

   The Python wiki contains an extensive list of `web frameworks
   <http://wiki.python.org/moin/WebFrameworks>`_.

   Most frameworks also have their own mailing lists and IRC channels, look out
   for these on the projects' web sites.  There is also a general "Python in the
   Web" IRC channel on freenode called `#python.web
   <http://wiki.python.org/moin/PoundPythonWeb>`_.
