Commit 079d5ed6 authored by Ezio Melotti's avatar Ezio Melotti

Merged revisions 79781 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r79781 | ezio.melotti | 2010-04-05 06:51:38 +0300 (Mon, 05 Apr 2010) | 1 line

  #8212: rephrase the webservers howto and fix some mistakes.
........
parent 66a1bd55
...@@ -6,74 +6,75 @@ ...@@ -6,74 +6,75 @@
.. topic:: Abstract .. topic:: Abstract
This document shows how Python fits into the web. It presents some ways on This document shows how Python fits into the web. It presents some ways
how to integrate Python with the web server and general practices useful for to integrate Python with a web server, and general practices useful for
developing web sites. developing web sites.
Programming for the Web has become a hot topic since the raise of the "Web 2.0", 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 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. possible to use Python for creating web sites, but it was a rather tedious task.
Therefore, many so-called "frameworks" and helper tools were created to help Therefore, many frameworks and helper tools have been created to assist
developers creating sites faster and these sites being more robust. This HOWTO developers in creating faster and more robust sites. This HOWTO describes
describes some of the methods used to combine Python with a web server to create some of the methods used to combine Python with a web server to create
dynamic content. It is not meant as a general introduction as this topic is far dynamic content. It is not meant as a complete introduction, as this topic is
too broad to be covered in one single document. However, a short overview of far too broad to be covered in one single document. However, a short overview
the most popular libraries is provided. of the most popular libraries is provided.
.. seealso:: .. seealso::
While this HOWTO tries to give an overview over Python in the Web, it cannot 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 moving always be as up to date as desired. Web development in Python is rapidly
forward rapidly, so the wiki page on `Web Programming moving forward, so the wiki page on `Web Programming
<http://wiki.python.org/moin/WebProgramming>`_ might be more in sync with <http://wiki.python.org/moin/WebProgramming>`_ may be more in sync with
recent development. recent development.
The low-level view The Low-Level View
================== ==================
.. .. image:: http.png 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
When a user enters a web site, his browser makes a connection to the site's
webserver (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 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. the *response*). This is roughly how the underlying protocol, HTTP, works.
Now, dynamic web sites are not files in the file system, but rather programs Dynamic web sites are not based on files in the file system, but rather on
which are run by the web server when a request comes in. They can do all sorts programs which are run by the web server when a request comes in, and which
of useful things, like display the postings of a bulletin board, show your *generate* the content that is returned to the user. They can do all sorts of
mails, configurate software or just display the current time. These programs useful things, like display the postings of a bulletin board, show your email,
can be written in about any programming language the server supports, so it is configure software, or just display the current time. These programs can be
easy to use Python for creating dynamic web sites. written in any programming language the server supports. Since most servers
support Python, it is easy to use Python to create dynamic web sites.
As most of HTTP servers are written in C or C++, they cannot execute Python code Most HTTP servers are written in C or C++, so they cannot execute Python code
in a simple way -- a bridge is needed between the server and the program. These directly -- a bridge is needed between the server and the program. These
bridges or rather interfaces define how programs interact with the server. In bridges, or rather interfaces, define how programs interact with the server.
the past there have been numerous attempts to create the best possible There have been numerous attempts to create the best possible interface, but
interface, but there are only a few worth mentioning. there are only a few worth mentioning.
Not every web server supports every interface. Many web servers do support only Not every web server supports every interface. Many web servers only support
old, now-obsolete interfaces. But they can often be extended using some old, now-obsolete interfaces; however, they can often be extended using
third-party modules to support new interfaces. third-party modules to support newer ones.
Common Gateway Interface Common Gateway Interface
------------------------ ------------------------
This interface is the oldest one, supported by nearly every web server out of This interface, most commonly referred to as "CGI", is the oldest, and is
the box. Programs using CGI to communicate with their web server need to be supported by nearly every web server out of the box. Programs using CGI to
started by the server for every request. So, every request starts a new Python communicate with their web server need to be started by the server for every
interpreter -- which takes some time to start up -- thus making the whole request. So, every request starts a new Python interpreter -- which takes some
interface only usable for low load situations. 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 program which uses CGI is a The upside of CGI is that it is simple -- writing a Python program which uses
matter of about three lines of code. But this simplicity comes at a price: it CGI is a matter of about three lines of code. This simplicity comes at a
does very few things to help the developer. price: it does very few things to help the developer.
Writing CGI programs, while still possible, is not recommended anymore. With Writing CGI programs, while still possible, is no longer recommended. With
WSGI (more on that later) it is possible to write programs that emulate CGI, so :ref:`WSGI <WSGI>`, a topic covered later in this document, it is possible to write
they can be run as CGI if no better option is available. programs that emulate CGI, so they can be run as CGI if no better option is
available.
.. seealso:: .. seealso::
...@@ -81,7 +82,7 @@ they can be run as CGI if no better option is available. ...@@ -81,7 +82,7 @@ they can be run as CGI if no better option is available.
creating plain CGI programs: creating plain CGI programs:
* :mod:`cgi` -- Handling of user input in CGI scripts * :mod:`cgi` -- Handling of user input in CGI scripts
* :mod:`cgitb` -- Displays nice tracebacks when errors happen in of CGI * :mod:`cgitb` -- Displays nice tracebacks when errors happen in CGI
applications, instead of presenting a "500 Internal Server Error" message applications, instead of presenting a "500 Internal Server Error" message
The Python wiki features a page on `CGI scripts The Python wiki features a page on `CGI scripts
...@@ -107,16 +108,15 @@ simple CGI program:: ...@@ -107,16 +108,15 @@ simple CGI program::
print("Hello World!") print("Hello World!")
You need to write this code into a file with a ``.py`` or ``.cgi`` extension, Depending on your web server configuration, you may need to save this code with
this depends on your web server configuration. Depending on your web server a ``.py`` or ``.cgi`` extension. Additionally, this file may also need to be
configuration, this file may also need to be in a ``cgi-bin`` folder, for in a ``cgi-bin`` folder, for security reasons.
security reasons.
You might wonder what the ``cgitb`` line is about. This line makes it possible 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 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 Server Error" in the user's browser. This is useful for debugging, but it might
risk exposing some confident data to the user. Don't use it when the script is risk exposing some confidential data to the user. You should not use ``cgitb``
ready for production use. Still, you should *always* catch exceptions, and 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 display proper error pages -- end-users don't like to see nondescript "Internal
Server Errors" in their browsers. Server Errors" in their browsers.
...@@ -125,73 +125,83 @@ Setting up CGI on your own server ...@@ -125,73 +125,83 @@ Setting up CGI on your own server
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
If you don't have your own web server, this does not apply to you. You can If you don't have your own web server, this does not apply to you. You can
check whether if works as-is and if not you need to talk to the administrator of check whether it works as-is, and if not you will need to talk to the
your web server anyway. If it is a big hoster, you can try filing a ticket administrator of your web server. If it is a big host, you can try filing a
asking for Python support. ticket asking for Python support.
If you're your own administrator or want to install it for testing purposes on 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 one and your own computers, you have to configure it by yourself. There is no single
single way on how to configure CGI, as there are many web servers with different way to configure CGI, as there are many web servers with different
configuration options. The currently most widely used free web server is configuration options. Currently the most widely used free web server is
`Apache HTTPd <http://httpd.apache.org/>`_, Apache for short -- this is the one `Apache HTTPd <http://httpd.apache.org/>`_, or Apache for short. Apache can be
that most people use, it can be easily installed on nearly every system using easily installed on nearly every system using the system's package management
the systems' package management. But `lighttpd <http://www.lighttpd.net>`_ has tool. `lighttpd <http://www.lighttpd.net>`_ is another alternative and is
been gaining attention since some time and is said to have a better performance. said to have better performance. On many systems this server can also be
On many systems this server can also be installed using the package management, installed using the package management tool, so manually compiling the web
so manually compiling the web server is never needed. server may not be needed.
* On Apache you can take a look into the `Dynamic Content with CGI * 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 <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 is described. Most of the time it is enough just to set ``+ExecCGI``. The
tutorial also describes the most common gotchas that might arise. tutorial also describes the most common gotchas that might arise.
* On lighttpd you need to use the `CGI module * On lighttpd you need to use the `CGI module
<http://trac.lighttpd.net/trac/wiki/Docs%3AModCGI>`_ which can be configured <http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModCGI>`_\ , which can be configured
in a straightforward way. It boils down to setting ``cgi.assign`` properly. in a straightforward way. It boils down to setting ``cgi.assign`` properly.
Common problems with CGI scripts Common problems with CGI scripts
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Trying to use CGI sometimes leads to small annoyances that one might experience Using CGI sometimes leads to small annoyances while trying to get these
while trying to get these scripts to run. Sometimes it happens that a seemingly scripts to run. Sometimes a seemingly correct script does not work as
correct script does not work as expected, which is caused by some small hidden expected, the cause being some small hidden problem that's difficult to spot.
reason that's difficult to spot.
Some of these reasons are: Some of these potential problems are:
* The Python script is not marked executable. When CGI scripts are not * The Python script is not marked as executable. When CGI scripts are not
executable most of the web servers will let the user download it, instead of 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 running it and sending the output to the user. For CGI scripts to run
properly the ``+x`` bit needs to be set. Using ``chmod a+x your_script.py`` properly on Unix-like operating systems, the ``+x`` bit needs to be set.
might already solve the problem. Using ``chmod a+x your_script.py`` may solve this problem.
* The line endings must be of Unix-type. This is important because the web
server checks the first line of the script (called shebang) and tries to run * On a Unix-like system, The line endings in the program file must be Unix
the program specified there. It gets easily confused by Windows line endings style line endings. This is important because the web server checks the
(Carriage Return & Line Feed, also called CRLF), so you have to convert the first line of the script (called shebang) and tries to run the program
file to Unix line endings (only Line Feed, LF). This can be done specified there. It gets easily confused by Windows line endings (Carriage
automatically by uploading the file via FTP in text mode instead of binary Return & Line Feed, also called CRLF), so you have to convert the file to
mode, but the preferred way is just telling your editor to save the files with Unix line endings (only Line Feed, LF). This can be done automatically by
Unix line endings. Most proper editors support this. uploading the file via FTP in text mode instead of binary mode, but the
* Your web server must be able to read the file, you need to make sure the preferred way is just telling your editor to save the files with Unix line
permissions are fine. Often the server runs as user and group ``www-data``, endings. Most editors support this.
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``. * Your web server must be able to read the file, and you need to make sure the
* The webserver must be able to know that the file you're trying to access is a permissions are correct. On unix-like systems, the server often runs as user
CGI script. Check the configuration of your web server, maybe there is some and group ``www-data``, so it might be worth a try to change the file
mistake. ownership, or making the file world readable by using ``chmod a+r
* The path to the interpreter in the shebang (``#!/usr/bin/env python``) must be your_script.py``.
currect. This line calls ``/usr/bin/env`` to find Python, but it'll fail if
there is no ``/usr/bin/env``. If you know where your Python is installed, you * The web server must know that the file you're trying to access is a CGI script.
can also use that path. The commands ``whereis python`` and ``type -p Check the configuration of your web server, as it may be configured
python`` might also help to find where it is installed. Once this is known, to expect a specific file extension for CGI scripts.
the shebang line can be changed accordingly: ``#!/usr/bin/python``.
* 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 * The file must not contain a BOM (Byte Order Mark). The BOM is meant for
determining the byte order of UTF-16 encodings, but some editors write this determining the byte order of UTF-16 and UTF-32 encodings, but some editors
also into UTF-8 files. The BOM interferes with the shebang line, so be sure write this also into UTF-8 files. The BOM interferes with the shebang line,
to tell your editor not to write the BOM. so be sure to tell your editor not to write the BOM.
* :ref:`mod-python` might be making problems. mod_python is able to handle CGI
scripts by itself, but it can also be a source for problems. Be sure you * If the web server is using :ref:`mod-python`, ``mod_python`` may be having
disable it. problems. ``mod_python`` is able to handle CGI scripts by itself, but it can
also be a source of issues.
.. _mod-python: .. _mod-python:
...@@ -200,33 +210,34 @@ mod_python ...@@ -200,33 +210,34 @@ mod_python
---------- ----------
People coming from PHP often find it hard to grasp how to use Python in the web. 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 Their first thought is mostly `mod_python <http://www.modpython.org/>`_\ ,
they think that this is the equivalent to ``mod_php``. Actually it is not because they think that this is the equivalent to ``mod_php``. Actually, there
really. It does embed the interpreter into the Apache process, thus speeding up are many differences. What ``mod_python`` does is embed the interpreter into
requests by not having to start a Python interpreter every request. On the the Apache process, thus speeding up requests by not having to start a Python
other hand, it is by far not "Python intermixed with HTML" as PHP often does. interpreter for each request. On the other hand, it is not "Python intermixed
The Python equivalent of that is a template engine. mod_python itself is much with HTML" in the way that PHP is often intermixed with HTML. The Python
more powerful and gives more access to Apache internals. It can emulate CGI, it equivalent of that is a template engine. ``mod_python`` itself is much more
can work an a "Python Server Pages" mode similar to JSP which is "HTML powerful and provides more access to Apache internals. It can emulate CGI,
intermangled with Python" and it has a "Publisher" which destignates one file to work in a "Python Server Pages" mode (similar to JSP) which is "HTML
accept all requests and decide on what to do then. intermingled with Python", and it has a "Publisher" which designates one file
to accept all requests and decide what to do with them.
But mod_python has some problems. Unlike the PHP interpreter the Python
interpreter uses caching when executing files, so when changing a file the whole ``mod_python`` does have some problems. Unlike the PHP interpreter, the Python
web server needs to be re-started to update. Another problem ist the basic interpreter uses caching when executing files, so changes to a file will
concept -- Apache starts some child processes to handle the requests and require the web server to be restarted. Another problem is the basic concept
unfortunately every child process needs to load the whole Python interpreter -- Apache starts child processes to handle the requests, and unfortunately
even if it does not use it. This makes the whole web server slower. Another every child process needs to load the whole Python interpreter even if it does
problem is that as mod_python is linked against a specific version of not use it. This makes the whole web server slower. Another problem is that,
``libpython``, it is not possible to switch from an older version to a newer because ``mod_python`` is linked against a specific version of ``libpython``,
(e.g. 2.4 to 2.5) without recompiling mod_python. mod_python is also bound to it is not possible to switch from an older version to a newer (e.g. 2.4 to 2.5)
the Apache web server, so programs written for mod_python cannot easily run on without recompiling ``mod_python``. ``mod_python`` is also bound to the Apache
other web servers. 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 might be still a good idea to use mod_python These are the reasons why ``mod_python`` should be avoided when writing new
for deployment, but WSGI makes it possible to run WSGI programs under mod_python programs. In some circumstances it still might be a good idea to use
as well. ``mod_python`` for deployment, but WSGI makes it possible to run WSGI programs
under ``mod_python`` as well.
FastCGI and SCGI FastCGI and SCGI
...@@ -234,19 +245,19 @@ FastCGI and SCGI ...@@ -234,19 +245,19 @@ FastCGI and SCGI
FastCGI and SCGI try to solve the performance problem of CGI in another way. 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 Instead of embedding the interpreter into the web server, they create
long-running processes which run in the background. There still is some module long-running background processes. There is still a module in the web server
in the web server which makes it possible for the web server to "speak" with the which makes it possible for the web server to "speak" with the background
background process. As the background process is independent from the server, process. As the background process is independent of the server, it can be
it can be written in any language of course also in Python. The language just written in any language, including Python. The language just needs to have a
needs to have a library which handles the communication with the web server. library which handles the communication with the webserver.
The difference between FastCGI and SCGI is very small, as SCGI is essentially The difference between FastCGI and SCGI is very small, as SCGI is essentially
just a "simpler FastCGI". But as the web server support for SCGI is limited 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 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 write about that applies to SCGI also applies to FastCGI as well, so we'll only cover
the latter. the latter.
These days, FastCGI is never used directly. Just like ``mod_python`` it is only These days, FastCGI is never used directly. Just like ``mod_python``, it is only
used for the deployment of WSGI applications. used for the deployment of WSGI applications.
.. seealso:: .. seealso::
...@@ -260,17 +271,20 @@ used for the deployment of WSGI applications. ...@@ -260,17 +271,20 @@ used for the deployment of WSGI applications.
Setting up FastCGI Setting up FastCGI
^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
Depending on the web server you need to have a special module. Each web server requires a specific module.
* Apache has both `mod_fastcgi <http://www.fastcgi.com/>`_ and `mod_fcgid * 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 <http://fastcgi.coremail.cn/>`_. ``mod_fastcgi`` is the original one, but it
has some licensing issues that's why it is sometimes considered non-free. 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 ``mod_fcgid`` is a smaller, compatible alternative. One of these modules needs
to be loaded by Apache. to be loaded by Apache.
* lighttpd ships its own `FastCGI module * lighttpd ships its own `FastCGI module
<http://trac.lighttpd.net/trac/wiki/Docs%3AModFastCGI>`_ as well as an `SCGI <http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModFastCGI>`_ as well as an
module <http://trac.lighttpd.net/trac/wiki/Docs%3AModSCGI>`_. `SCGI module <http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModSCGI>`_.
* nginx also supports `FastCGI <http://wiki.nginx.org/NginxSimplePythonFCGI>`_.
* `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 Once you have installed and configured the module, you can test it with the
following WSGI-application:: following WSGI-application::
...@@ -301,28 +315,27 @@ FastCGI access. ...@@ -301,28 +315,27 @@ FastCGI access.
.. seealso:: .. seealso::
There is some documentation on `setting up Django with FastCGI There is some documentation on `setting up Django with FastCGI
<http://www.djangoproject.com/documentation/fastcgi/>`_, most of which can be <http://docs.djangoproject.com/en/dev/howto/deployment/fastcgi/>`_, most of
reused for other WSGI-compliant frameworks and libraries. Only the which can be reused for other WSGI-compliant frameworks and libraries.
``manage.py`` part has to be changed, the example used here can be used Only the ``manage.py`` part has to be changed, the example used here can be
instead. Django does more or less the exact same thing. used instead. Django does more or less the exact same thing.
mod_wsgi mod_wsgi
-------- --------
`mod_wsgi <http://www.modwsgi.org/>`_ is an attempt to get rid of the low level `mod_wsgi <http://code.google.com/p/modwsgi/>`_ is an attempt to get rid of the
gateways. As FastCGI, SCGI, mod_python are mostly used to deploy WSGI low level gateways. Given that FastCGI, SCGI, and mod_python are mostly used to
applications anyway, mod_wsgi was started to directly embed WSGI aplications deploy WSGI applications, mod_wsgi was started to directly embed WSGI applications
into the Apache web server. The benefit from this approach is that WSGI into the Apache web server. mod_wsgi is specifically designed to host WSGI
applications can be deployed much easier as is is specially designed to host applications. It makes the deployment of WSGI applications much easier than
WSGI applications -- unlike the other low level methods which have glue code to deployment using other low level methods, which need glue code. The downside
host WSGI applications (like flup which was mentioned before). The downside is is that mod_wsgi is limited to the Apache web server; other servers would need
that mod_wsgi is limited to the Apache web server, other servers would need
their own implementations of mod_wsgi. their own implementations of mod_wsgi.
It supports two modes: the embedded mode in which it integrates with the Apache mod_wsgi supports two modes: embedded mode, in which it integrates with the
process and the daemon mode which is more FastCGI-like. Contrary to FastCGI, Apache process, and daemon mode, which is more FastCGI-like. Unlike FastCGI,
mod_wsgi handles the worker-processes by itself which makes administration mod_wsgi handles the worker-processes by itself, which makes administration
easier. easier.
...@@ -331,58 +344,61 @@ easier. ...@@ -331,58 +344,61 @@ easier.
Step back: WSGI Step back: WSGI
=============== ===============
WSGI was already mentioned several times so it has to be something important. WSGI has already been mentioned several times, so it has to be something
In fact it really is, so now it's time to explain. important. In fact it really is, and now it is time to explain it.
The *Web Server Gateway Interface*, :pep:`333` or WSGI for short is currently The *Web Server Gateway Interface*, or WSGI for short, is defined in
the best possible way to Python web programming. While it is great for :pep:`333` and is currently the best way to do Python web programming. While
programmers writing frameworks, the normal person does not need to get in direct it is great for programmers writing frameworks, a normal web developer does not
contact with it. But when choosing a framework for web development it is a good need to get in direct contact with it. When choosing a framework for web
idea to take one which supports WSGI. development it is a good idea to choose one which supports WSGI.
The big profit from WSGI is the unification. When your program is compatible The big benefit of WSGI is the unification of the application programming
with WSGI -- that means that your framework has support for WSGI, your program interface. When your program is compatible with WSGI -- which at the outer
can be deployed on every web server interface for which there are WSGI wrappers. level means that the framework you are using has support for WSGI -- your
So you do not need to care about whether the user uses mod_python or FastCGI -- program can be deployed via any web server interface for which there are WSGI
with WSGI it just works on any gateway interface. The Python standard library wrappers. You do not need to care about whether the application user uses
contains its own WSGI server :mod:`wsgiref`, which is a small web server that mod_python or FastCGI or mod_wsgi -- with WSGI your application will work on
can be used for testing. 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
A really great WSGI feature are the middlewares. Middlewares are layers around testing.
your program which can add various functionality to it. There is a `number of
middlewares <http://wsgi.org/wsgi/Middleware_and_Utilities>`_ already available. A really great WSGI feature is middleware. Middleware is a layer around your
For example, instead of writing your own session management (to identify a user program which can add various functionality to it. There is quite a bit of
in subsequent requests, as HTTP does not maintain state, so it does now know `middleware <http://wsgi.org/wsgi/Middleware_and_Utilities>`_ already
that the requests belong to the same user) you can just take one middleware, available. For example, instead of writing your own session management (HTTP
plug it in and you can rely an already existing functionality. The same thing is a stateless protocol, so to associate multiple HTTP requests with a single
is compression -- say you want to compress your HTML using gzip, to save your user your application must create and manage such state via a session), you can
server's bandwidth. So you only need to plug-in a middleware and you're done. just download middleware which does that, plug it in, and get on with coding
Authentication is also a problem easily solved using a middleware. the unique parts of your application. The same thing with compression -- there
is existing middleware which handles compressing your HTML using gzip to save
So, generally -- although WSGI may seem complex, the initial phase of learning on your server's bandwidth. Authentication is another a problem easily solved
can be very rewarding as WSGI does already have solutions to many problems that using existing middleware.
might arise while writing web sites.
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 WSGI Servers
------------ ------------
The code that is used to connect to various low level gateways like CGI or The code that is used to connect to various low level gateways like CGI or
mod_python is called *WSGI server*. One of these servers is ``flup`` which was mod_python is called a *WSGI server*. One of these servers is ``flup``, which
already mentioned and supports FastCGI, SCGI as well as `AJP supports FastCGI and SCGI, as well as `AJP
<http://en.wikipedia.org/wiki/Apache_JServ_Protocol>`_. Some of these servers <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 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. written in C and can be used as drop-in replacements.
There are quite a lot of servers already available, so a Python web application There are many servers already available, so a Python web application
can be deployed nearly everywhere. This is one big advantage that Python has can be deployed nearly anywhere. This is one big advantage that Python has
compared with other web techniques. compared with other web technologies.
.. seealso:: .. seealso::
A good overview of all WSGI-related code can be found in the `WSGI wiki 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>`_, which contains an extensive list of `WSGI servers
<http://wsgi.org/wsgi/Servers>`_, which can be used by *every* application <http://wsgi.org/wsgi/Servers>`_ which can be used by *any* application
supporting WSGI. supporting WSGI.
You might be interested in some WSGI-supporting modules already contained in You might be interested in some WSGI-supporting modules already contained in
...@@ -394,39 +410,46 @@ compared with other web techniques. ...@@ -394,39 +410,46 @@ compared with other web techniques.
Case study: MoinMoin Case study: MoinMoin
-------------------- --------------------
What does WSGI give the web application developer? Let's take a look on one What does WSGI give the web application developer? Let's take a look at
long existing web application written in Python without using WSGI. 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.
One of the most widely used wiki software is `MoinMoin <http://moinmo.in/>`_. It now includes support for WSGI. Using WSGI, it is possible to deploy
It was created in 2000, so it predates WSGI by about three years. While it now MoinMoin on any WSGI compliant server, with no additional glue code.
includes support for WSGI, older versions needed separate code to run on CGI, Unlike the pre-WSGI versions, this could include WSGI servers that the
mod_python, FastCGI and standalone. Now, this all is possible by using WSGI and authors of MoinMoin know nothing about.
the already-written gateways. For running with on FastCGI ``flup`` can be used,
for running a standalone server :mod:`wsgiref` is the way to go.
Model-view-controller Model-View-Controller
===================== =====================
The term *MVC* is often heard in statements like "framework *foo* supports MVC". The term *MVC* is often encountered in statements such as "framework *foo*
While MVC is not really something technical but rather organisational, many web supports MVC". MVC is more about the overall organization of code, rather than
frameworks use this model to help the developer to bring structure into his any particular API. Many web frameworks use this model to help the developer
program. Bigger web applications can have lots of code so it is a good idea to bring structure to their program. Bigger web applications can have lots of
have structure in the program right from the beginnings. That way, even users code, so it is a good idea to have an effective structure right from the beginning.
of other frameworks (or even languages, as MVC is nothing Python-specific) can That way, even users of other frameworks (or even other languages, since MVC is
understand the existing code easier, as they are already familiar with the not Python-specific) can easily understand the code, given that they are
structure. already familiar with the MVC structure.
MVC stands for three components: MVC stands for three components:
* The *model*. This is the data that is meant to modify. In Python frameworks * The *model*. This is the data that will be displayed and modified. In
this component is often represented by the classes used by the Python frameworks, this component is often represented by the classes used by
object-relational mapper. So, all declarations go here. an object-relational mapper.
* The *view*. This component's job is to display the data of the model to the * The *view*. This component's job is to display the data of the model to the
user. Typically this component is represented by the templates. user. Typically this component is implemented via templates.
* The *controller*. This is the layer between the user and the model. The * The *controller*. This is the layer between the user and the model. The
controller reacts on user actions (like opening some specific URL) and tells controller reacts to user actions (like opening some specific URL), tells
the model to modify the data if necessary. 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. 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, It is used in Python because it has turned out to be useful for creating clean,
...@@ -438,132 +461,136 @@ maintainable web sites. ...@@ -438,132 +461,136 @@ maintainable web sites.
to create a web site which uses the MVC pattern by separating the data logic 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 (the model) from the user interaction logic (the controller) and the
templates (the view). That's why it is important not to write unnecessary templates (the view). That's why it is important not to write unnecessary
Python code in the templates -- it is against MVC and creates more chaos. 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:: .. seealso::
The english Wikipedia has an article about the `Model-View-Controller pattern The English Wikipedia has an article about the `Model-View-Controller pattern
<http://en.wikipedia.org/wiki/Model-view-controller>`_, which includes a long <http://en.wikipedia.org/wiki/Model-view-controller>`_. It includes a long
list of web frameworks for different programming languages. list of web frameworks for various programming languages.
Ingredients for web sites Ingredients for Websites
========================= ========================
Web sites are complex constructs, so tools were created to help the web site Websites are complex constructs, so tools have been created to help web
developer to make his work maintainable. None of these tools are in any way developers make their code easier to write and more maintainable. Tools like
Python specific, they also exist for other programming languages as well. Of these exist for all web frameworks in all languages. Developers are not forced
course, developers are not forced to use these tools and often there is no to use these tools, and often there is no "best" tool. It is worth learning
"best" tool, but it is worth informing yourself before choosing something about the available tools because they can greatly simplify the process of
because of the big number of helpers that the developer can use. developing a web site.
.. seealso:: .. seealso::
People have written far more components that can be combined than these There are far more components than can be presented here. The Python wiki
presented here. The Python wiki has a page about these components, called has a page about these components, called
`Web Components <http://wiki.python.org/moin/WebComponents>`_. `Web Components <http://wiki.python.org/moin/WebComponents>`_.
Templates Templates
--------- ---------
Mixing of HTML and Python code is possible with some libraries. While 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 convenient at first, it leads to horribly unmaintainable code. That's why
templates exist. Templates are, in the simplest case, just HTML files with templates exist. Templates are, in the simplest case, just HTML files with
placeholders. The HTML is sent to the user's browser after filling out the placeholders. The HTML is sent to the user's browser after filling in the
placeholders. placeholders.
Python already includes such simple templates:: Python already includes a way to build simple templates::
# a simple template # a simple template
template = "<html><body><h1>Hello {who}!</h1></body></html>" template = "<html><body><h1>Hello {who}!</h1></body></html>"
print(template.format(who="Reader")) print(template.format(who="Reader"))
The Python standard library also includes some more advanced templates usable To generate complex HTML based on non-trivial model data, conditional
through :class:`string.Template`, but in HTML templates it is needed to use and looping constructs like Python's *for* and *if* are generally needed.
conditional and looping contructs like Python's *for* and *if*. So, some *Template engines* support templates of this complexity.
*template engine* is needed.
Now, Python has a lot of template engines which can be used with or without a
`framework`_. Some of these are using a plain-text programming language which
is very easy to learn as it is quite limited while others use XML so the
template output is always guaranteed to be valid XML. Some `frameworks`_ ship
their own template engine or recommend one particular. If one is not yet sure,
using these is a good idea.
.. note:: 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.
While Python has quite a lot of different template engines it usually does Some `frameworks`_ ship their own template engine or recommend one in
not make sense to use a homebrewed template system. The time needed to particular. In the absence of a reason to use a different template engine,
evaluate all templating systems is not really worth it, better invest the using the one provided by or recommended by the framework is a good idea.
time in looking through the most popular ones. Some frameworks have their
own template engine or have a recommentation for one. It's wise to use
these.
Popular template engines include: Popular template engines include:
* Mako * `Mako <http://www.makotemplates.org/>`_
* Genshi * `Genshi <http://genshi.edgewall.org/>`_
* Jinja * `Jinja <http://jinja.pocoo.org/2/>`_
.. seealso:: .. seealso::
Lots of different template engines divide the attention between themselves There are many template engines competing for attention, becuase it is
because it's easy to create them in Python. The page `Templating pretty easy to create them in Python. The page `Templating
<http://wiki.python.org/moin/Templating>`_ in the wiki lists a big, <http://wiki.python.org/moin/Templating>`_ in the wiki lists a big,
ever-growing number of these. 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
---------------- ----------------
*Data persistence*, while sounding very complicated is just about storing data. *Data persistence*, while sounding very complicated, is just about storing data.
This data might be the text of blog entries, the postings of a bulletin board or This data might be the text of blog entries, the postings on a bulletin board or
the text of a wiki page. As always, there are different ways to store the text of a wiki page. There are, of course, a number of different ways to store
informations on a web server. information on a web server.
Often relational database engines like `MySQL <http://www.mysql.com/>`_ or Often, relational database engines like `MySQL <http://www.mysql.com/>`_ or
`PostgreSQL <http://www.postgresql.org/>`_ are used due to their good `PostgreSQL <http://www.postgresql.org/>`_ are used because of their good
performance handling very large databases consisting of up to millions of performance when handling very large databases consisting of millions of
entries. These are *queried* using a language called `SQL entries. There is also a small database engine called `SQLite
<http://en.wikipedia.org/wiki/SQL>`_. Python programmers in general do not like <http://www.sqlite.org/>`_, which is bundled with Python in the :mod:`sqlite3`
SQL too much, they prefer to work with objects. It is possible to save Python module, and which uses only one file. It has no other dependencies. For
objects into a database using a technology called `ORM smaller sites SQLite is just enough.
<http://en.wikipedia.org/wiki/Object-relational_mapping>`_. ORM translates all
object-oriented access into SQL code under the hood, the user does not need to Relational databases are *queried* using a language called `SQL
think about it. Most `frameworks`_ use ORMs and it works quite well. <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
A second possibility is using files that are saved on the hard disk (sometimes Python objects into a database using a technology called `ORM
called flatfiles). This is very easy, but is not too fast. There is even a <http://en.wikipedia.org/wiki/Object-relational_mapping>`_ (Object Relational
small database engine called `SQLite <http://www.sqlite.org/>`_ which is bundled Mapping). ORM translates all object-oriented access into SQL code under the
with Python in the :mod:`sqlite` module and uses only one file. This database hood, so the developer does not need to think about it. Most `frameworks`_ use
can be used to store objects via an ORM and has no other dependencies. For ORMs, and it works quite well.
smaller sites SQLite is just enough. But it is not the only way in which data
can be saved into the file systems. Sometimes normal, plain text files are A second possibility is storing data in normal, plain text files (some
enough. 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
The third and least used possibility are so-called object oriented databases. updates to the stored data.
These databases store the *actual objects* instead of the relations that
OR-mapping creates between rows in a database. This has the advantage that A third possibility are object oriented databases (also called "object
nearly all objects can be saven in a straightforward way, unlike in relational databases"). These databases store the object data in a form that closely
databases where some objects are very hard to represent with ORMs. 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
`Frameworks`_ often give the users hints on which method to choose, it is and relations between those rows.) Storing the objects directly has the
usually a good idea to stick to these unless there are some special requirements advantage that nearly all objects can be saved in a straightforward way, unlike
which require to use the one method and not the other. 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:: .. seealso::
* `Persistence Tools <http://wiki.python.org/moin/PersistenceTools>`_ lists * `Persistence Tools <http://wiki.python.org/moin/PersistenceTools>`_ lists
possibilities on how to save data in the file system, some of these modules possibilities on how to save data in the file system. Some of these
are part of the standard library modules are part of the standard library
* `Database Programming <http://wiki.python.org/moin/DatabaseProgramming>`_ * `Database Programming <http://wiki.python.org/moin/DatabaseProgramming>`_
helps on choosing a method on how to save the data 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 it easier to * `SQLAlchemy <http://www.sqlalchemy.org/>`_, the most powerful OR-Mapper
use for Python, and `Elixir <http://elixir.ematia.de/>`_, which makes
SQLAlchemy easier to use
* `SQLObject <http://www.sqlobject.org/>`_, another popular OR-Mapper * `SQLObject <http://www.sqlobject.org/>`_, another popular OR-Mapper
* `ZODB <https://launchpad.net/zodb>`_ and `Durus * `ZODB <https://launchpad.net/zodb>`_ and `Durus
<http://www.mems-exchange.org/software/durus/>`_, two object oriented <http://www.mems-exchange.org/software/durus/>`_, two object oriented
databases databases
...@@ -574,42 +601,44 @@ which require to use the one method and not the other. ...@@ -574,42 +601,44 @@ which require to use the one method and not the other.
Frameworks Frameworks
========== ==========
As web sites can easily become quite large, there are so-called frameworks which The process of creating code to run web sites involves writing code to provide
were created to help the developer with making these sites. Although the most various services. The code to provide a particular service often works the
well-known framework is Ruby on Rails, Python does also have its own frameworks same way regardless of the complexity or purpose of the web site in question.
which are partly inspired by Rails or which were existing a long time before Abstracting these common solutions into reusable code produces what are called
Rails. "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
Two possible approaches to web frameworks exist: the minimalistic approach and these were partly inspired by Rails, or borrowed ideas from Rails, but many
the all-inclusive approach (somtimes called *full-stack*). Frameworks which are existed a long time before Rails.
all-inclusive give you everything you need to start working, like a template
engine, some way to save and access data in databases and many features more. Originally Python web frameworks tended to incorporate all of the services
Most users are best off using these as they are widely used by lots of other needed to develop web sites as a giant, integrated set of tools. No two web
users and well documented in form of books and tutorials. Other web frameworks frameworks were interoperable: a program developed for one could not be
go the minimalistic approach trying to be as flexible as possible leaving the deployed on a different one without considerable re-engineering work. This led
user the freedom to choose what's best for him. 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
The majority of users is best off with all-inclusive framewors. They bring services to be added on top via separate components. Some ad hoc standards
everything along so a user can just jump in and start to code. While they do were developed that allowed for limited interoperability between frameworks,
have some limitations they can fullfill 80% of what one will ever want to such as a standard that allowed different template engines to be used
perfectly. They consist of various components which are designed to work interchangeably.
together as good as possible.
Since the advent of WSGI, the Python web framework world has been evolving
The multitude of web frameworks written in Python demonstrates that it is really toward interoperability based on the WSGI standard. Now many web frameworks,
easy to write one. One of the most well-known web applications written in whether "full stack" (providing all the tools one needs to deploy the most
Python is `Zope <http://www.zope.org/>`_ which can be regarded as some kind of complex web sites) or minimalist, or anything in between, are built from
big framework. But Zope was not the only framework, there were some others collections of reusable components that can be used with more than one
which are by now nearly forgotten. These do not need to be mentioned anymore, framework.
because most people that used them moved on to newer ones.
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 Some notable frameworks
----------------------- -----------------------
There is an incredible number of frameworks, so there is no way to describe them There are an incredible number of frameworks, so they cannot all be covered
all. It is not even necessary, as most of these frameworks are nothing special here. Instead we will briefly touch on some of the most popular.
and everything that can be done with these can also be done with one of the
popular ones.
Django Django
...@@ -617,16 +646,16 @@ Django ...@@ -617,16 +646,16 @@ Django
`Django <http://www.djangoproject.com/>`_ is a framework consisting of several `Django <http://www.djangoproject.com/>`_ is a framework consisting of several
tightly coupled elements which were written from scratch and work together very 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 well. It includes an ORM which is quite powerful while being simple to use,
has a great online administration interface which makes it possible to edit the and has a great online administration interface which makes it possible to edit
data in the database with a browser. The template engine is text-based and is the data in the database with a browser. The template engine is text-based and
designed to be usable for page designers who cannot write Python. It supports is designed to be usable for page designers who cannot write Python. It
so-called template inheritance and filters (which work like Unix pipes). Django supports template inheritance and filters (which work like Unix pipes). Django
has many handy features bundled, like creation of RSS feeds or generic views has many handy features bundled, such as creation of RSS feeds or generic views,
which make it possible to write web sites nearly without any Python code. which make it possible to create web sites almost without writing any Python code.
It has a big, international community which has created many sites using Django. It has a big, international community, the members of which have created many
There are also quite a lot of add-on projects which extend Django's normal 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 functionality. This is partly due to Django's well written `online
documentation <http://docs.djangoproject.com/>`_ and the `Django book documentation <http://docs.djangoproject.com/>`_ and the `Django book
<http://www.djangobook.com/>`_. <http://www.djangobook.com/>`_.
...@@ -634,22 +663,20 @@ documentation <http://docs.djangoproject.com/>`_ and the `Django book ...@@ -634,22 +663,20 @@ documentation <http://docs.djangoproject.com/>`_ and the `Django book
.. note:: .. note::
Although Django is an MVC-style framework, it calls the components Although Django is an MVC-style framework, it names the elements
differently, which is described in the `Django FAQ differently, which is described in the `Django FAQ
<http://www.djangoproject.com/documentation/faq/#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>`_. <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 TurboGears
^^^^^^^^^^ ^^^^^^^^^^
The other popular web framework in Python is `TurboGears Another popular web framework for Python is `TurboGears
<http://www.turbogears.org/>`_. It takes the approach of using already existing <http://www.turbogears.org/>`_. TurboGears takes the approach of using already
components and combining them with glue code to create a seamless experience. existing components and combining them with glue code to create a seamless
TurboGears gives the user more flexibility on which components to choose, the experience. TurboGears gives the user flexibility in choosing components. For
ORM can be switched between some easy to use but limited and complex but very example the ORM and template engine can be changed to use packages different
powerful. Same goes for the template engine. One strong point about TurboGears from those used by default.
is that the components that it consists of can be used easily in other projects
without depending on TurboGears, for example the underlying web server CherryPy.
The documentation can be found in the `TurboGears wiki The documentation can be found in the `TurboGears wiki
<http://docs.turbogears.org/>`_, where links to screencasts can be found. <http://docs.turbogears.org/>`_, where links to screencasts can be found.
...@@ -657,31 +684,46 @@ TurboGears has also an active user community which can respond to most related ...@@ -657,31 +684,46 @@ TurboGears has also an active user community which can respond to most related
questions. There is also a `TurboGears book <http://turbogearsbook.com/>`_ questions. There is also a `TurboGears book <http://turbogearsbook.com/>`_
published, which is a good starting point. published, which is a good starting point.
The plan for the next major version of TurboGears, version 2.0 is to switch to a The newest version of TurboGears, version 2.0, moves even further in direction
more flexible base provided by another very flexible web framework called of WSGI support and a component-based architecture. TurboGears 2 is based on
`Pylons <http://pylonshq.com/>`_. 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 Other notable frameworks
^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^
These two are of course not the only frameworks that are available, there are Of course these are not the only frameworks that are available. There are
also some less-popular frameworks worth mentioning. many other frameworks worth mentioning.
One of these is the already mentioned Zope, which has been around for quite a
long time. With Zope 2.x having been known as rather un-pythonic, the newer
Zope 3.x tries to change that and therefore gets more acceptance from Python
programmers. These efforts already showed results, there is a project which
connects Zope with WSGI called `Repoze <http://repoze.org/>`_ and another
project called `Grok <http://grok.zope.org/>`_ which makes it possible for
"normal" Python programmers use the very mature Zope components.
Another framework that's already been mentioned is `Pylons`_. Pylons is much Another framework that's already been mentioned is `Pylons`_. Pylons is much
like TurboGears with an even stronger emphasis on flexibility, which is bought 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 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 exchanged, which makes it necessary to use the documentation of every single
component, because there are so many Pylons combinations possible that can component, of which there are many. Pylons builds upon `Paste
satisfy every requirement. Pylons builds upon `Paste
<http://pythonpaste.org/>`_, an extensive set of tools which are handy for WSGI. <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 And that's still not everything. The most up-to-date information can always be
...@@ -693,6 +735,6 @@ found in the Python wiki. ...@@ -693,6 +735,6 @@ found in the Python wiki.
<http://wiki.python.org/moin/WebFrameworks>`_. <http://wiki.python.org/moin/WebFrameworks>`_.
Most frameworks also have their own mailing lists and IRC channels, look out Most frameworks also have their own mailing lists and IRC channels, look out
for these on the projects' websites. There is also a general "Python in the for these on the projects' web sites. There is also a general "Python in the
Web" IRC channel on freenode called `#python.web Web" IRC channel on freenode called `#python.web
<http://wiki.python.org/moin/PoundPythonWeb>`_. <http://wiki.python.org/moin/PoundPythonWeb>`_.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment