2008-09-07 14:00:17 -03:00
|
|
|
*******************************
|
|
|
|
HOWTO Use Python in the web
|
|
|
|
*******************************
|
|
|
|
|
|
|
|
:Author: Marek Kubica
|
|
|
|
|
|
|
|
.. topic:: Abstract
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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
|
2008-09-07 14:00:17 -03:00
|
|
|
developing web sites.
|
|
|
|
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
Programming for the Web has become a hot topic since the rise of "Web 2.0",
|
2008-09-07 14:00:17 -03:00
|
|
|
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.
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
.. seealso::
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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
|
2008-09-07 14:00:17 -03:00
|
|
|
recent development.
|
|
|
|
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
The Low-Level View
|
2008-09-07 14:00:17 -03:00
|
|
|
==================
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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
|
2008-09-07 14:00:17 -03:00
|
|
|
file system and sends it back to the user's browser, which displays it (this is
|
2010-03-23 20:27:51 -03:00
|
|
|
the *response*). This is roughly how the underlying protocol, HTTP, works.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
|
|
|
|
Common Gateway Interface
|
|
|
|
------------------------
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
.. 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
|
2010-04-05 01:00:14 -03:00
|
|
|
* :mod:`cgitb` -- Displays nice tracebacks when errors happen in CGI
|
2008-09-07 14:00:17 -03:00
|
|
|
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.
|
|
|
|
|
Merged revisions 68133-68134,68141-68142,68145-68146,68148-68149,68159-68162,68166,68171-68174,68179,68195-68196,68210,68214-68215,68217-68222 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r68133 | antoine.pitrou | 2009-01-01 16:38:03 +0100 (Thu, 01 Jan 2009) | 1 line
fill in actual issue number in tests
........
r68134 | hirokazu.yamamoto | 2009-01-01 16:45:39 +0100 (Thu, 01 Jan 2009) | 2 lines
Issue #4797: IOError.filename was not set when _fileio.FileIO failed to open
file with `str' filename on Windows.
........
r68141 | benjamin.peterson | 2009-01-01 17:43:12 +0100 (Thu, 01 Jan 2009) | 1 line
fix highlighting
........
r68142 | benjamin.peterson | 2009-01-01 18:29:49 +0100 (Thu, 01 Jan 2009) | 2 lines
welcome to 2009, Python!
........
r68145 | amaury.forgeotdarc | 2009-01-02 01:03:54 +0100 (Fri, 02 Jan 2009) | 5 lines
#4801 _collections module fails to build on cygwin.
_PyObject_GC_TRACK is the macro version of PyObject_GC_Track,
and according to documentation it should not be used for extension modules.
........
r68146 | ronald.oussoren | 2009-01-02 11:44:46 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue4472: "configure --enable-shared doesn't work on OSX"
........
r68148 | ronald.oussoren | 2009-01-02 11:48:31 +0100 (Fri, 02 Jan 2009) | 2 lines
Forgot to add a NEWS item in my previous checkin
........
r68149 | ronald.oussoren | 2009-01-02 11:50:48 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue4780
........
r68159 | ronald.oussoren | 2009-01-02 15:48:17 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue 1627952
........
r68160 | ronald.oussoren | 2009-01-02 15:52:09 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue r1737832
........
r68161 | ronald.oussoren | 2009-01-02 16:00:05 +0100 (Fri, 02 Jan 2009) | 3 lines
Fix for issue 1149804
........
r68162 | ronald.oussoren | 2009-01-02 16:06:00 +0100 (Fri, 02 Jan 2009) | 3 lines
Fix for issue 4472 is incompatible with Cygwin, this patch
should fix that.
........
r68166 | benjamin.peterson | 2009-01-02 19:26:23 +0100 (Fri, 02 Jan 2009) | 1 line
document PyMemberDef
........
r68171 | georg.brandl | 2009-01-02 21:25:14 +0100 (Fri, 02 Jan 2009) | 3 lines
#4811: fix markup glitches (mostly remains of the conversion),
found by Gabriel Genellina.
........
r68172 | martin.v.loewis | 2009-01-02 21:32:55 +0100 (Fri, 02 Jan 2009) | 2 lines
Issue #4075: Use OutputDebugStringW in Py_FatalError.
........
r68173 | martin.v.loewis | 2009-01-02 21:40:14 +0100 (Fri, 02 Jan 2009) | 2 lines
Issue #4051: Prevent conflict of UNICODE macros in cPickle.
........
r68174 | benjamin.peterson | 2009-01-02 21:47:27 +0100 (Fri, 02 Jan 2009) | 1 line
fix compilation on non-Windows platforms
........
r68179 | raymond.hettinger | 2009-01-02 22:26:45 +0100 (Fri, 02 Jan 2009) | 1 line
Issue #4615. Document how to use itertools for de-duping.
........
r68195 | georg.brandl | 2009-01-03 14:45:15 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove useless string literal.
........
r68196 | georg.brandl | 2009-01-03 15:29:53 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix indentation.
........
r68210 | georg.brandl | 2009-01-03 20:10:12 +0100 (Sat, 03 Jan 2009) | 2 lines
Set eol-style correctly for mp_distributing.py.
........
r68214 | georg.brandl | 2009-01-03 20:44:48 +0100 (Sat, 03 Jan 2009) | 2 lines
Make indentation consistent.
........
r68215 | georg.brandl | 2009-01-03 21:15:14 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix role name.
........
r68217 | georg.brandl | 2009-01-03 21:30:15 +0100 (Sat, 03 Jan 2009) | 2 lines
Add rstlint, a little tool to find subtle markup problems and inconsistencies in the Doc sources.
........
r68218 | georg.brandl | 2009-01-03 21:38:59 +0100 (Sat, 03 Jan 2009) | 2 lines
Recognize usage of the default role.
........
r68219 | georg.brandl | 2009-01-03 21:47:01 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix uses of the default role.
........
r68220 | georg.brandl | 2009-01-03 21:55:06 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove trailing whitespace.
........
r68221 | georg.brandl | 2009-01-03 22:04:55 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove tabs from the documentation.
........
r68222 | georg.brandl | 2009-01-03 22:11:58 +0100 (Sat, 03 Jan 2009) | 2 lines
Disable the line length checker by default.
........
2009-01-03 17:55:17 -04:00
|
|
|
|
2008-09-07 14:00:17 -03:00
|
|
|
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
|
Merged revisions 68582,68718,68720-68721,68724-68727,68859,68973,69288-69289,69293,69295,69297-69301,69409,69414,69570,69573,69576,69728-69730,69769,69776,69803-69805,69840,69896 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r68582 | georg.brandl | 2009-01-13 23:14:01 +0100 (Di, 13 Jan 2009) | 2 lines
Use assertRaises.
........
r68718 | georg.brandl | 2009-01-18 11:42:35 +0100 (So, 18 Jan 2009) | 1 line
#4976: union() and intersection() take multiple args, but talk about "the other".
........
r68720 | georg.brandl | 2009-01-18 11:45:22 +0100 (So, 18 Jan 2009) | 1 line
#4974: fix redundant mention of lists and tuples.
........
r68721 | georg.brandl | 2009-01-18 11:48:16 +0100 (So, 18 Jan 2009) | 1 line
#4914: trunc is in math.
........
r68724 | georg.brandl | 2009-01-18 14:24:10 +0100 (So, 18 Jan 2009) | 1 line
#4979: correct result range for some random functions.
........
r68725 | georg.brandl | 2009-01-18 14:47:26 +0100 (So, 18 Jan 2009) | 1 line
#4857: fix augmented assignment target spec.
........
r68726 | georg.brandl | 2009-01-18 15:41:52 +0100 (So, 18 Jan 2009) | 1 line
#4923: clarify what was added.
........
r68727 | georg.brandl | 2009-01-18 19:25:30 +0100 (So, 18 Jan 2009) | 1 line
#4986: augassigns are not expressions.
........
r68859 | georg.brandl | 2009-01-22 19:29:28 +0100 (Do, 22 Jan 2009) | 2 lines
Clarify wording.
........
r68973 | georg.brandl | 2009-01-26 22:29:38 +0100 (Mo, 26 Jan 2009) | 2 lines
Copy over docs on advanced role features from Sphinx docs.
........
r69288 | georg.brandl | 2009-02-05 11:30:57 +0100 (Do, 05 Feb 2009) | 1 line
#5153: fix typo in example.
........
r69289 | georg.brandl | 2009-02-05 11:37:07 +0100 (Do, 05 Feb 2009) | 1 line
#5144: document that PySys_SetArgv prepends the script directory (or the empty string) to sys.path.
........
r69293 | georg.brandl | 2009-02-05 11:59:28 +0100 (Do, 05 Feb 2009) | 1 line
#5059: fix example.
........
r69295 | georg.brandl | 2009-02-05 12:23:47 +0100 (Do, 05 Feb 2009) | 1 line
PyErr_PrintEx is also in 2.x...
........
r69297 | georg.brandl | 2009-02-05 12:32:18 +0100 (Do, 05 Feb 2009) | 1 line
#5015: document PythonHome API functions.
........
r69298 | georg.brandl | 2009-02-05 12:33:21 +0100 (Do, 05 Feb 2009) | 1 line
#4827: fix callback example.
........
r69299 | georg.brandl | 2009-02-05 12:35:28 +0100 (Do, 05 Feb 2009) | 1 line
#4820: use correct module for ctypes.util.
........
r69300 | georg.brandl | 2009-02-05 12:38:23 +0100 (Do, 05 Feb 2009) | 1 line
#4563: disable alpha and roman lists, fixes wrong formatting of contributor list.
........
r69301 | georg.brandl | 2009-02-05 12:40:35 +0100 (Do, 05 Feb 2009) | 1 line
#5031: fix Thread.daemon property docs.
........
r69409 | georg.brandl | 2009-02-07 13:21:17 +0100 (Sa, 07 Feb 2009) | 1 line
#5174: fix wrong file closing in example.
........
r69414 | georg.brandl | 2009-02-07 19:49:54 +0100 (Sa, 07 Feb 2009) | 1 line
make "super only for new-style classes" a note.
........
r69570 | georg.brandl | 2009-02-13 11:40:14 +0100 (Fr, 13 Feb 2009) | 1 line
#4894: document "newurl" parameter to redirect_request().
........
r69573 | georg.brandl | 2009-02-13 11:44:17 +0100 (Fr, 13 Feb 2009) | 1 line
#3734: document complex coercing behavior better.
........
r69576 | georg.brandl | 2009-02-13 11:56:50 +0100 (Fr, 13 Feb 2009) | 1 line
#1661108: note that urlsafe encoded string can contain "=".
........
r69728 | georg.brandl | 2009-02-18 01:22:55 +0100 (Mi, 18 Feb 2009) | 2 lines
#5297: fix example.
........
r69729 | georg.brandl | 2009-02-18 01:25:13 +0100 (Mi, 18 Feb 2009) | 2 lines
#5296: sequence -> iterable.
........
r69730 | georg.brandl | 2009-02-18 01:31:36 +0100 (Mi, 18 Feb 2009) | 2 lines
#5268: mention VMSError.
........
r69769 | georg.brandl | 2009-02-19 09:30:06 +0100 (Do, 19 Feb 2009) | 1 line
#5310, #3558: fix operator precedence table.
........
r69776 | georg.brandl | 2009-02-19 17:34:51 +0100 (Do, 19 Feb 2009) | 2 lines
#5317: update IronPython URL.
........
r69803 | georg.brandl | 2009-02-20 08:48:21 +0100 (Fr, 20 Feb 2009) | 1 line
#5327: fix a broken link by joining it.
........
r69804 | georg.brandl | 2009-02-20 09:22:21 +0100 (Fr, 20 Feb 2009) | 1 line
At least separate imports from other statements.
........
r69805 | georg.brandl | 2009-02-20 09:45:47 +0100 (Fr, 20 Feb 2009) | 2 lines
Fix punctuation.
........
r69840 | georg.brandl | 2009-02-21 20:09:40 +0100 (Sa, 21 Feb 2009) | 1 line
#5338, #5339: two types in the API manual.
........
r69896 | georg.brandl | 2009-02-23 11:24:23 +0100 (Mo, 23 Feb 2009) | 1 line
#5348: format() converts all kinds of values.
........
2009-02-23 06:41:11 -04:00
|
|
|
import cgitb
|
|
|
|
cgitb.enable()
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
print "Content-Type: text/plain;charset=utf-8"
|
|
|
|
print
|
|
|
|
|
|
|
|
print "Hello World!"
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
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
|
2010-04-05 01:00:14 -03:00
|
|
|
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
|
2008-09-07 14:00:17 -03:00
|
|
|
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
|
2010-04-05 01:00:14 -03:00
|
|
|
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
|
2008-09-07 14:00:17 -03:00
|
|
|
<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.
|
2010-04-05 01:00:14 -03:00
|
|
|
|
2008-09-07 14:00:17 -03:00
|
|
|
* On lighttpd you need to use the `CGI module
|
2010-04-05 01:00:14 -03:00
|
|
|
<http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModCGI>`_\ , which can be configured
|
2008-09-07 14:00:17 -03:00
|
|
|
in a straightforward way. It boils down to setting ``cgi.assign`` properly.
|
|
|
|
|
|
|
|
|
|
|
|
Common problems with CGI scripts
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
Some of these potential problems are:
|
2008-09-07 14:00:17 -03:00
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
* 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
|
2008-09-07 14:00:17 -03:00
|
|
|
running it and sending the output to the user. For CGI scripts to run
|
2010-04-05 01:00:14 -03:00
|
|
|
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``.
|
|
|
|
|
2008-09-07 14:00:17 -03:00
|
|
|
* The file must not contain a BOM (Byte Order Mark). The BOM is meant for
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
|
|
|
|
.. _mod-python:
|
|
|
|
|
|
|
|
mod_python
|
|
|
|
----------
|
|
|
|
|
|
|
|
People coming from PHP often find it hard to grasp how to use Python in the web.
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
|
|
|
|
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
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
The difference between FastCGI and SCGI is very small, as SCGI is essentially
|
2010-04-05 01:00:14 -03:00
|
|
|
just a "simpler FastCGI". As the web server support for SCGI is limited,
|
2008-09-07 14:00:17 -03:00
|
|
|
most people use FastCGI instead, which works the same way. Almost everything
|
2010-04-05 01:00:14 -03:00
|
|
|
that applies to SCGI also applies to FastCGI as well, so we'll only cover
|
2008-09-07 14:00:17 -03:00
|
|
|
the latter.
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
These days, FastCGI is never used directly. Just like ``mod_python``, it is only
|
2008-09-07 14:00:17 -03:00
|
|
|
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
|
|
|
|
^^^^^^^^^^^^^^^^^^
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
Each web server requires a specific module.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
* Apache has both `mod_fastcgi <http://www.fastcgi.com/drupal/>`_ and `mod_fcgid
|
2008-09-07 14:00:17 -03:00
|
|
|
<http://fastcgi.coremail.cn/>`_. ``mod_fastcgi`` is the original one, but it
|
2010-04-05 01:00:14 -03:00
|
|
|
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
|
2008-09-07 14:00:17 -03:00
|
|
|
to be loaded by Apache.
|
2010-04-05 01:00:14 -03:00
|
|
|
|
2008-09-07 14:00:17 -03:00
|
|
|
* lighttpd ships its own `FastCGI module
|
2010-04-05 01:00:14 -03:00
|
|
|
<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>`_.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
Once you have installed and configured the module, you can test it with the
|
|
|
|
following WSGI-application::
|
|
|
|
|
|
|
|
#!/usr/bin/env python
|
|
|
|
# -*- coding: UTF-8 -*-
|
|
|
|
|
|
|
|
from cgi import escape
|
|
|
|
import sys, os
|
|
|
|
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>%s</th><td>%s</td></tr>' % (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
|
2010-04-05 01:00:14 -03:00
|
|
|
<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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
|
|
|
|
mod_wsgi
|
|
|
|
--------
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
`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
|
2008-09-07 14:00:17 -03:00
|
|
|
their own implementations of mod_wsgi.
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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
|
2008-09-07 14:00:17 -03:00
|
|
|
easier.
|
|
|
|
|
|
|
|
|
|
|
|
.. _WSGI:
|
|
|
|
|
|
|
|
Step back: WSGI
|
|
|
|
===============
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
|
|
|
|
WSGI Servers
|
|
|
|
------------
|
|
|
|
|
|
|
|
The code that is used to connect to various low level gateways like CGI or
|
2010-04-05 01:00:14 -03:00
|
|
|
mod_python is called a *WSGI server*. One of these servers is ``flup``, which
|
|
|
|
supports FastCGI and SCGI, as well as `AJP
|
2008-09-07 14:00:17 -03:00
|
|
|
<http://en.wikipedia.org/wiki/Apache_JServ_Protocol>`_. Some of these servers
|
2010-04-05 01:00:14 -03:00
|
|
|
are written in Python, as ``flup`` is, but there also exist others which are
|
2008-09-07 14:00:17 -03:00
|
|
|
written in C and can be used as drop-in replacements.
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
.. seealso::
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
A good overview of WSGI-related code can be found in the `WSGI wiki
|
2008-09-07 14:00:17 -03:00
|
|
|
<http://wsgi.org/wsgi>`_, which contains an extensive list of `WSGI servers
|
2010-04-05 01:00:14 -03:00
|
|
|
<http://wsgi.org/wsgi/Servers>`_ which can be used by *any* application
|
2008-09-07 14:00:17 -03:00
|
|
|
supporting WSGI.
|
|
|
|
|
|
|
|
You might be interested in some WSGI-supporting modules already contained in
|
|
|
|
the standard library, namely:
|
Merged revisions 68133-68134,68141-68142,68145-68146,68148-68149,68159-68162,68166,68171-68174,68179,68195-68196,68210,68214-68215,68217-68222 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r68133 | antoine.pitrou | 2009-01-01 16:38:03 +0100 (Thu, 01 Jan 2009) | 1 line
fill in actual issue number in tests
........
r68134 | hirokazu.yamamoto | 2009-01-01 16:45:39 +0100 (Thu, 01 Jan 2009) | 2 lines
Issue #4797: IOError.filename was not set when _fileio.FileIO failed to open
file with `str' filename on Windows.
........
r68141 | benjamin.peterson | 2009-01-01 17:43:12 +0100 (Thu, 01 Jan 2009) | 1 line
fix highlighting
........
r68142 | benjamin.peterson | 2009-01-01 18:29:49 +0100 (Thu, 01 Jan 2009) | 2 lines
welcome to 2009, Python!
........
r68145 | amaury.forgeotdarc | 2009-01-02 01:03:54 +0100 (Fri, 02 Jan 2009) | 5 lines
#4801 _collections module fails to build on cygwin.
_PyObject_GC_TRACK is the macro version of PyObject_GC_Track,
and according to documentation it should not be used for extension modules.
........
r68146 | ronald.oussoren | 2009-01-02 11:44:46 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue4472: "configure --enable-shared doesn't work on OSX"
........
r68148 | ronald.oussoren | 2009-01-02 11:48:31 +0100 (Fri, 02 Jan 2009) | 2 lines
Forgot to add a NEWS item in my previous checkin
........
r68149 | ronald.oussoren | 2009-01-02 11:50:48 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue4780
........
r68159 | ronald.oussoren | 2009-01-02 15:48:17 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue 1627952
........
r68160 | ronald.oussoren | 2009-01-02 15:52:09 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue r1737832
........
r68161 | ronald.oussoren | 2009-01-02 16:00:05 +0100 (Fri, 02 Jan 2009) | 3 lines
Fix for issue 1149804
........
r68162 | ronald.oussoren | 2009-01-02 16:06:00 +0100 (Fri, 02 Jan 2009) | 3 lines
Fix for issue 4472 is incompatible with Cygwin, this patch
should fix that.
........
r68166 | benjamin.peterson | 2009-01-02 19:26:23 +0100 (Fri, 02 Jan 2009) | 1 line
document PyMemberDef
........
r68171 | georg.brandl | 2009-01-02 21:25:14 +0100 (Fri, 02 Jan 2009) | 3 lines
#4811: fix markup glitches (mostly remains of the conversion),
found by Gabriel Genellina.
........
r68172 | martin.v.loewis | 2009-01-02 21:32:55 +0100 (Fri, 02 Jan 2009) | 2 lines
Issue #4075: Use OutputDebugStringW in Py_FatalError.
........
r68173 | martin.v.loewis | 2009-01-02 21:40:14 +0100 (Fri, 02 Jan 2009) | 2 lines
Issue #4051: Prevent conflict of UNICODE macros in cPickle.
........
r68174 | benjamin.peterson | 2009-01-02 21:47:27 +0100 (Fri, 02 Jan 2009) | 1 line
fix compilation on non-Windows platforms
........
r68179 | raymond.hettinger | 2009-01-02 22:26:45 +0100 (Fri, 02 Jan 2009) | 1 line
Issue #4615. Document how to use itertools for de-duping.
........
r68195 | georg.brandl | 2009-01-03 14:45:15 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove useless string literal.
........
r68196 | georg.brandl | 2009-01-03 15:29:53 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix indentation.
........
r68210 | georg.brandl | 2009-01-03 20:10:12 +0100 (Sat, 03 Jan 2009) | 2 lines
Set eol-style correctly for mp_distributing.py.
........
r68214 | georg.brandl | 2009-01-03 20:44:48 +0100 (Sat, 03 Jan 2009) | 2 lines
Make indentation consistent.
........
r68215 | georg.brandl | 2009-01-03 21:15:14 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix role name.
........
r68217 | georg.brandl | 2009-01-03 21:30:15 +0100 (Sat, 03 Jan 2009) | 2 lines
Add rstlint, a little tool to find subtle markup problems and inconsistencies in the Doc sources.
........
r68218 | georg.brandl | 2009-01-03 21:38:59 +0100 (Sat, 03 Jan 2009) | 2 lines
Recognize usage of the default role.
........
r68219 | georg.brandl | 2009-01-03 21:47:01 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix uses of the default role.
........
r68220 | georg.brandl | 2009-01-03 21:55:06 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove trailing whitespace.
........
r68221 | georg.brandl | 2009-01-03 22:04:55 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove tabs from the documentation.
........
r68222 | georg.brandl | 2009-01-03 22:11:58 +0100 (Sat, 03 Jan 2009) | 2 lines
Disable the line length checker by default.
........
2009-01-03 17:55:17 -04:00
|
|
|
|
2008-09-07 14:00:17 -03:00
|
|
|
* :mod:`wsgiref` -- some tiny utilities and servers for WSGI
|
|
|
|
|
|
|
|
|
|
|
|
Case study: MoinMoin
|
|
|
|
--------------------
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
Model-View-Controller
|
2008-09-07 14:00:17 -03:00
|
|
|
=====================
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
MVC stands for three components:
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
* 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.
|
|
|
|
|
2008-09-07 14:00:17 -03:00
|
|
|
* The *view*. This component's job is to display the data of the model to the
|
2010-04-05 01:00:14 -03:00
|
|
|
user. Typically this component is implemented via templates.
|
|
|
|
|
2008-09-07 14:00:17 -03:00
|
|
|
* The *controller*. This is the layer between the user and the model. The
|
2010-04-05 01:00:14 -03:00
|
|
|
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,
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
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
|
2009-07-02 12:37:21 -03:00
|
|
|
to create a web site which uses the MVC pattern by separating the data logic
|
2008-09-07 14:00:17 -03:00
|
|
|
(the model) from the user interaction logic (the controller) and the
|
2009-07-02 12:37:21 -03:00
|
|
|
templates (the view). That's why it is important not to write unnecessary
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
.. seealso::
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
Ingredients for Websites
|
|
|
|
========================
|
2008-09-07 14:00:17 -03:00
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
|
|
|
|
.. seealso::
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
There are far more components than can be presented here. The Python wiki
|
|
|
|
has a page about these components, called
|
2008-09-07 14:00:17 -03:00
|
|
|
`Web Components <http://wiki.python.org/moin/WebComponents>`_.
|
|
|
|
|
|
|
|
|
|
|
|
Templates
|
|
|
|
---------
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
Mixing of HTML and Python code is made possible by a few libraries. While
|
2008-09-07 14:00:17 -03:00
|
|
|
convenient at first, it leads to horribly unmaintainable code. That's why
|
|
|
|
templates exist. Templates are, in the simplest case, just HTML files with
|
2010-04-05 01:00:14 -03:00
|
|
|
placeholders. The HTML is sent to the user's browser after filling in the
|
2008-09-07 14:00:17 -03:00
|
|
|
placeholders.
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
Python already includes two ways to build simple templates::
|
2008-09-07 14:00:17 -03:00
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
>>> template = "<html><body><h1>Hello %s!</h1></body></html>"
|
|
|
|
>>> print template % "Reader"
|
|
|
|
<html><body><h1>Hello Reader!</h1></body></html>
|
2008-09-07 14:00:17 -03:00
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
>>> from string import Template
|
|
|
|
>>> template = Template("<html><body><h1>Hello ${name}</h1></body></html>")
|
|
|
|
>>> print template.substitute(dict(name='Dinsdale'))
|
|
|
|
<html><body><h1>Hello Dinsdale!</h1></body></html>
|
2008-09-07 14:00:17 -03:00
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
Merged revisions 68133-68134,68141-68142,68145-68146,68148-68149,68159-68162,68166,68171-68174,68179,68195-68196,68210,68214-68215,68217-68222 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r68133 | antoine.pitrou | 2009-01-01 16:38:03 +0100 (Thu, 01 Jan 2009) | 1 line
fill in actual issue number in tests
........
r68134 | hirokazu.yamamoto | 2009-01-01 16:45:39 +0100 (Thu, 01 Jan 2009) | 2 lines
Issue #4797: IOError.filename was not set when _fileio.FileIO failed to open
file with `str' filename on Windows.
........
r68141 | benjamin.peterson | 2009-01-01 17:43:12 +0100 (Thu, 01 Jan 2009) | 1 line
fix highlighting
........
r68142 | benjamin.peterson | 2009-01-01 18:29:49 +0100 (Thu, 01 Jan 2009) | 2 lines
welcome to 2009, Python!
........
r68145 | amaury.forgeotdarc | 2009-01-02 01:03:54 +0100 (Fri, 02 Jan 2009) | 5 lines
#4801 _collections module fails to build on cygwin.
_PyObject_GC_TRACK is the macro version of PyObject_GC_Track,
and according to documentation it should not be used for extension modules.
........
r68146 | ronald.oussoren | 2009-01-02 11:44:46 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue4472: "configure --enable-shared doesn't work on OSX"
........
r68148 | ronald.oussoren | 2009-01-02 11:48:31 +0100 (Fri, 02 Jan 2009) | 2 lines
Forgot to add a NEWS item in my previous checkin
........
r68149 | ronald.oussoren | 2009-01-02 11:50:48 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue4780
........
r68159 | ronald.oussoren | 2009-01-02 15:48:17 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue 1627952
........
r68160 | ronald.oussoren | 2009-01-02 15:52:09 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue r1737832
........
r68161 | ronald.oussoren | 2009-01-02 16:00:05 +0100 (Fri, 02 Jan 2009) | 3 lines
Fix for issue 1149804
........
r68162 | ronald.oussoren | 2009-01-02 16:06:00 +0100 (Fri, 02 Jan 2009) | 3 lines
Fix for issue 4472 is incompatible with Cygwin, this patch
should fix that.
........
r68166 | benjamin.peterson | 2009-01-02 19:26:23 +0100 (Fri, 02 Jan 2009) | 1 line
document PyMemberDef
........
r68171 | georg.brandl | 2009-01-02 21:25:14 +0100 (Fri, 02 Jan 2009) | 3 lines
#4811: fix markup glitches (mostly remains of the conversion),
found by Gabriel Genellina.
........
r68172 | martin.v.loewis | 2009-01-02 21:32:55 +0100 (Fri, 02 Jan 2009) | 2 lines
Issue #4075: Use OutputDebugStringW in Py_FatalError.
........
r68173 | martin.v.loewis | 2009-01-02 21:40:14 +0100 (Fri, 02 Jan 2009) | 2 lines
Issue #4051: Prevent conflict of UNICODE macros in cPickle.
........
r68174 | benjamin.peterson | 2009-01-02 21:47:27 +0100 (Fri, 02 Jan 2009) | 1 line
fix compilation on non-Windows platforms
........
r68179 | raymond.hettinger | 2009-01-02 22:26:45 +0100 (Fri, 02 Jan 2009) | 1 line
Issue #4615. Document how to use itertools for de-duping.
........
r68195 | georg.brandl | 2009-01-03 14:45:15 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove useless string literal.
........
r68196 | georg.brandl | 2009-01-03 15:29:53 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix indentation.
........
r68210 | georg.brandl | 2009-01-03 20:10:12 +0100 (Sat, 03 Jan 2009) | 2 lines
Set eol-style correctly for mp_distributing.py.
........
r68214 | georg.brandl | 2009-01-03 20:44:48 +0100 (Sat, 03 Jan 2009) | 2 lines
Make indentation consistent.
........
r68215 | georg.brandl | 2009-01-03 21:15:14 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix role name.
........
r68217 | georg.brandl | 2009-01-03 21:30:15 +0100 (Sat, 03 Jan 2009) | 2 lines
Add rstlint, a little tool to find subtle markup problems and inconsistencies in the Doc sources.
........
r68218 | georg.brandl | 2009-01-03 21:38:59 +0100 (Sat, 03 Jan 2009) | 2 lines
Recognize usage of the default role.
........
r68219 | georg.brandl | 2009-01-03 21:47:01 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix uses of the default role.
........
r68220 | georg.brandl | 2009-01-03 21:55:06 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove trailing whitespace.
........
r68221 | georg.brandl | 2009-01-03 22:04:55 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove tabs from the documentation.
........
r68222 | georg.brandl | 2009-01-03 22:11:58 +0100 (Sat, 03 Jan 2009) | 2 lines
Disable the line length checker by default.
........
2009-01-03 17:55:17 -04:00
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
Popular template engines include:
|
2008-09-07 14:00:17 -03:00
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
* `Mako <http://www.makotemplates.org/>`_
|
|
|
|
* `Genshi <http://genshi.edgewall.org/>`_
|
|
|
|
* `Jinja <http://jinja.pocoo.org/2/>`_
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
.. seealso::
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
There are many template engines competing for attention, becuase it is
|
|
|
|
pretty easy to create them in Python. The page `Templating
|
2008-09-07 14:00:17 -03:00
|
|
|
<http://wiki.python.org/moin/Templating>`_ in the wiki lists a big,
|
2010-04-05 01:00:14 -03:00
|
|
|
ever-growing number of these. The three listed above are considered "second
|
|
|
|
generation" template engines and are a good place to start.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
|
|
|
|
Data persistence
|
|
|
|
----------------
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
*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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
.. seealso::
|
|
|
|
|
|
|
|
* `Persistence Tools <http://wiki.python.org/moin/PersistenceTools>`_ lists
|
2010-04-05 01:00:14 -03:00
|
|
|
possibilities on how to save data in the file system. Some of these
|
|
|
|
modules are part of the standard library
|
|
|
|
|
2008-09-07 14:00:17 -03:00
|
|
|
* `Database Programming <http://wiki.python.org/moin/DatabaseProgramming>`_
|
2010-04-05 01:00:14 -03:00
|
|
|
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
|
|
|
|
|
2008-09-07 14:00:17 -03:00
|
|
|
* `SQLObject <http://www.sqlobject.org/>`_, another popular OR-Mapper
|
2010-04-05 01:00:14 -03:00
|
|
|
|
2008-09-07 14:00:17 -03:00
|
|
|
* `ZODB <https://launchpad.net/zodb>`_ and `Durus
|
|
|
|
<http://www.mems-exchange.org/software/durus/>`_, two object oriented
|
|
|
|
databases
|
|
|
|
|
|
|
|
|
|
|
|
.. _framework:
|
|
|
|
|
|
|
|
Frameworks
|
|
|
|
==========
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
|
|
|
|
Some notable frameworks
|
|
|
|
-----------------------
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
|
|
|
|
Django
|
|
|
|
^^^^^^
|
|
|
|
|
|
|
|
`Django <http://www.djangoproject.com/>`_ is a framework consisting of several
|
|
|
|
tightly coupled elements which were written from scratch and work together very
|
2010-04-05 01:00:14 -03:00
|
|
|
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
|
2008-09-07 14:00:17 -03:00
|
|
|
functionality. This is partly due to Django's well written `online
|
Merged revisions 75363,75365,75376,75392,75394,75403,75418,75484,75572,75580,75590,75592,75594-75596,75600,75602-75603,75605-75607,75610-75613,75616-75617,75623,75627,75647 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r75363 | georg.brandl | 2009-10-11 20:31:23 +0200 (So, 11 Okt 2009) | 1 line
Add the Python FAQ lists to the documentation. Copied from sandbox/faq. Many thanks to AMK for the preparation work.
........
r75365 | georg.brandl | 2009-10-11 22:16:16 +0200 (So, 11 Okt 2009) | 1 line
Fix broken links found by "make linkcheck". scipy.org seems to be done right now, so I could not verify links going there.
........
r75376 | benjamin.peterson | 2009-10-12 03:26:07 +0200 (Mo, 12 Okt 2009) | 1 line
platform we don't care about
........
r75392 | andrew.kuchling | 2009-10-13 18:11:49 +0200 (Di, 13 Okt 2009) | 1 line
Various link, textual, and markup fixes
........
r75394 | georg.brandl | 2009-10-13 20:10:59 +0200 (Di, 13 Okt 2009) | 1 line
Fix markup.
........
r75403 | georg.brandl | 2009-10-14 17:57:46 +0200 (Mi, 14 Okt 2009) | 1 line
#7126: os.environ changes *do* take effect in subprocesses started with os.system().
........
r75418 | georg.brandl | 2009-10-14 20:48:32 +0200 (Mi, 14 Okt 2009) | 1 line
#7116: str.join() takes an iterable.
........
r75484 | georg.brandl | 2009-10-18 09:58:12 +0200 (So, 18 Okt 2009) | 1 line
Fix missing word.
........
r75572 | benjamin.peterson | 2009-10-20 23:55:17 +0200 (Di, 20 Okt 2009) | 1 line
clarify buffer arg #7178
........
r75580 | georg.brandl | 2009-10-21 09:15:59 +0200 (Mi, 21 Okt 2009) | 1 line
#7170: fix explanation about non-weakrefable builtin types.
........
r75590 | benjamin.peterson | 2009-10-22 04:36:47 +0200 (Do, 22 Okt 2009) | 1 line
rewrite to be nice to other implementations
........
r75592 | georg.brandl | 2009-10-22 09:05:48 +0200 (Do, 22 Okt 2009) | 1 line
Fix punctuation.
........
r75594 | georg.brandl | 2009-10-22 09:56:02 +0200 (Do, 22 Okt 2009) | 1 line
Fix markup.
........
r75595 | georg.brandl | 2009-10-22 09:56:56 +0200 (Do, 22 Okt 2009) | 1 line
Fix duplicate target.
........
r75596 | georg.brandl | 2009-10-22 10:05:04 +0200 (Do, 22 Okt 2009) | 1 line
Add a new directive marking up implementation details and start using it.
........
r75600 | georg.brandl | 2009-10-22 13:01:46 +0200 (Do, 22 Okt 2009) | 1 line
Make it more robust.
........
r75602 | georg.brandl | 2009-10-22 13:28:06 +0200 (Do, 22 Okt 2009) | 1 line
Document new directive.
........
r75603 | georg.brandl | 2009-10-22 13:28:23 +0200 (Do, 22 Okt 2009) | 1 line
Allow short form with text as argument.
........
r75605 | georg.brandl | 2009-10-22 13:48:10 +0200 (Do, 22 Okt 2009) | 1 line
Use "impl-detail" directive where applicable.
........
r75606 | georg.brandl | 2009-10-22 17:00:06 +0200 (Do, 22 Okt 2009) | 1 line
#6324: membership test tries iteration via __iter__.
........
r75607 | georg.brandl | 2009-10-22 17:04:09 +0200 (Do, 22 Okt 2009) | 1 line
#7088: document new functions in signal as Unix-only.
........
r75610 | georg.brandl | 2009-10-22 17:27:24 +0200 (Do, 22 Okt 2009) | 1 line
Reorder __slots__ fine print and add a clarification.
........
r75611 | georg.brandl | 2009-10-22 17:42:32 +0200 (Do, 22 Okt 2009) | 1 line
#7035: improve docs of the various <method>_errors() functions, and give them docstrings.
........
r75612 | georg.brandl | 2009-10-22 17:52:15 +0200 (Do, 22 Okt 2009) | 1 line
#7156: document curses as Unix-only.
........
r75613 | georg.brandl | 2009-10-22 17:54:35 +0200 (Do, 22 Okt 2009) | 1 line
#6977: getopt does not support optional option arguments.
........
r75616 | georg.brandl | 2009-10-22 18:17:05 +0200 (Do, 22 Okt 2009) | 1 line
Add proper references.
........
r75617 | georg.brandl | 2009-10-22 18:20:55 +0200 (Do, 22 Okt 2009) | 1 line
Make printout margin important.
........
r75623 | georg.brandl | 2009-10-23 10:14:44 +0200 (Fr, 23 Okt 2009) | 1 line
#7188: fix optionxform() docs.
........
r75627 | fred.drake | 2009-10-23 15:04:51 +0200 (Fr, 23 Okt 2009) | 2 lines
add further note about what's passed to optionxform
........
r75647 | georg.brandl | 2009-10-24 12:04:19 +0200 (Sa, 24 Okt 2009) | 1 line
Fix markup.
........
2009-10-27 12:08:27 -03:00
|
|
|
documentation <http://docs.djangoproject.com/>`_ and the `Django book
|
2008-09-07 14:00:17 -03:00
|
|
|
<http://www.djangobook.com/>`_.
|
|
|
|
|
|
|
|
|
|
|
|
.. note::
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
Although Django is an MVC-style framework, it names the elements
|
2008-09-07 14:00:17 -03:00
|
|
|
differently, which is described in the `Django FAQ
|
2010-04-05 01:00:14 -03:00
|
|
|
<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>`_.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
|
|
|
|
TurboGears
|
|
|
|
^^^^^^^^^^
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
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.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
|
|
|
|
Other notable frameworks
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
2010-04-05 01:00:14 -03:00
|
|
|
Of course these are not the only frameworks that are available. There are
|
|
|
|
many other frameworks worth mentioning.
|
2008-09-07 14:00:17 -03:00
|
|
|
|
|
|
|
Another framework that's already been mentioned is `Pylons`_. Pylons is much
|
2010-04-05 01:00:14 -03:00
|
|
|
like TurboGears, but with an even stronger emphasis on flexibility, which comes
|
2008-09-07 14:00:17 -03:00
|
|
|
at the cost of being more difficult to use. Nearly every component can be
|
2009-07-02 12:37:21 -03:00
|
|
|
exchanged, which makes it necessary to use the documentation of every single
|
2010-04-05 01:00:14 -03:00
|
|
|
component, of which there are many. Pylons builds upon `Paste
|
2008-09-07 14:00:17 -03:00
|
|
|
<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::
|
Merged revisions 68133-68134,68141-68142,68145-68146,68148-68149,68159-68162,68166,68171-68174,68179,68195-68196,68210,68214-68215,68217-68222 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r68133 | antoine.pitrou | 2009-01-01 16:38:03 +0100 (Thu, 01 Jan 2009) | 1 line
fill in actual issue number in tests
........
r68134 | hirokazu.yamamoto | 2009-01-01 16:45:39 +0100 (Thu, 01 Jan 2009) | 2 lines
Issue #4797: IOError.filename was not set when _fileio.FileIO failed to open
file with `str' filename on Windows.
........
r68141 | benjamin.peterson | 2009-01-01 17:43:12 +0100 (Thu, 01 Jan 2009) | 1 line
fix highlighting
........
r68142 | benjamin.peterson | 2009-01-01 18:29:49 +0100 (Thu, 01 Jan 2009) | 2 lines
welcome to 2009, Python!
........
r68145 | amaury.forgeotdarc | 2009-01-02 01:03:54 +0100 (Fri, 02 Jan 2009) | 5 lines
#4801 _collections module fails to build on cygwin.
_PyObject_GC_TRACK is the macro version of PyObject_GC_Track,
and according to documentation it should not be used for extension modules.
........
r68146 | ronald.oussoren | 2009-01-02 11:44:46 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue4472: "configure --enable-shared doesn't work on OSX"
........
r68148 | ronald.oussoren | 2009-01-02 11:48:31 +0100 (Fri, 02 Jan 2009) | 2 lines
Forgot to add a NEWS item in my previous checkin
........
r68149 | ronald.oussoren | 2009-01-02 11:50:48 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue4780
........
r68159 | ronald.oussoren | 2009-01-02 15:48:17 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue 1627952
........
r68160 | ronald.oussoren | 2009-01-02 15:52:09 +0100 (Fri, 02 Jan 2009) | 2 lines
Fix for issue r1737832
........
r68161 | ronald.oussoren | 2009-01-02 16:00:05 +0100 (Fri, 02 Jan 2009) | 3 lines
Fix for issue 1149804
........
r68162 | ronald.oussoren | 2009-01-02 16:06:00 +0100 (Fri, 02 Jan 2009) | 3 lines
Fix for issue 4472 is incompatible with Cygwin, this patch
should fix that.
........
r68166 | benjamin.peterson | 2009-01-02 19:26:23 +0100 (Fri, 02 Jan 2009) | 1 line
document PyMemberDef
........
r68171 | georg.brandl | 2009-01-02 21:25:14 +0100 (Fri, 02 Jan 2009) | 3 lines
#4811: fix markup glitches (mostly remains of the conversion),
found by Gabriel Genellina.
........
r68172 | martin.v.loewis | 2009-01-02 21:32:55 +0100 (Fri, 02 Jan 2009) | 2 lines
Issue #4075: Use OutputDebugStringW in Py_FatalError.
........
r68173 | martin.v.loewis | 2009-01-02 21:40:14 +0100 (Fri, 02 Jan 2009) | 2 lines
Issue #4051: Prevent conflict of UNICODE macros in cPickle.
........
r68174 | benjamin.peterson | 2009-01-02 21:47:27 +0100 (Fri, 02 Jan 2009) | 1 line
fix compilation on non-Windows platforms
........
r68179 | raymond.hettinger | 2009-01-02 22:26:45 +0100 (Fri, 02 Jan 2009) | 1 line
Issue #4615. Document how to use itertools for de-duping.
........
r68195 | georg.brandl | 2009-01-03 14:45:15 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove useless string literal.
........
r68196 | georg.brandl | 2009-01-03 15:29:53 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix indentation.
........
r68210 | georg.brandl | 2009-01-03 20:10:12 +0100 (Sat, 03 Jan 2009) | 2 lines
Set eol-style correctly for mp_distributing.py.
........
r68214 | georg.brandl | 2009-01-03 20:44:48 +0100 (Sat, 03 Jan 2009) | 2 lines
Make indentation consistent.
........
r68215 | georg.brandl | 2009-01-03 21:15:14 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix role name.
........
r68217 | georg.brandl | 2009-01-03 21:30:15 +0100 (Sat, 03 Jan 2009) | 2 lines
Add rstlint, a little tool to find subtle markup problems and inconsistencies in the Doc sources.
........
r68218 | georg.brandl | 2009-01-03 21:38:59 +0100 (Sat, 03 Jan 2009) | 2 lines
Recognize usage of the default role.
........
r68219 | georg.brandl | 2009-01-03 21:47:01 +0100 (Sat, 03 Jan 2009) | 2 lines
Fix uses of the default role.
........
r68220 | georg.brandl | 2009-01-03 21:55:06 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove trailing whitespace.
........
r68221 | georg.brandl | 2009-01-03 22:04:55 +0100 (Sat, 03 Jan 2009) | 2 lines
Remove tabs from the documentation.
........
r68222 | georg.brandl | 2009-01-03 22:11:58 +0100 (Sat, 03 Jan 2009) | 2 lines
Disable the line length checker by default.
........
2009-01-03 17:55:17 -04:00
|
|
|
|
2008-09-07 14:00:17 -03:00
|
|
|
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
|
2010-04-05 01:00:14 -03:00
|
|
|
for these on the projects' web sites. There is also a general "Python in the
|
2008-09-07 14:00:17 -03:00
|
|
|
Web" IRC channel on freenode called `#python.web
|
|
|
|
<http://wiki.python.org/moin/PoundPythonWeb>`_.
|