blob: a555083e325586580a1f5cd43e3280d06cd0e109 [file] [log] [blame]
Georg Brandl0f3629d2008-09-07 17:00:17 +00001*******************************
2 HOWTO Use Python in the web
3*******************************
4
5:Author: Marek Kubica
6
7.. topic:: Abstract
8
Ezio Melottic0deec12010-04-05 03:51:38 +00009 This document shows how Python fits into the web. It presents some ways
10 to integrate Python with a web server, and general practices useful for
Georg Brandl0f3629d2008-09-07 17:00:17 +000011 developing web sites.
12
13
Ezio Melottic0deec12010-04-05 03:51:38 +000014Programming for the Web has become a hot topic since the rise of "Web 2.0",
Georg Brandl0f3629d2008-09-07 17:00:17 +000015which focuses on user-generated content on web sites. It has always been
16possible to use Python for creating web sites, but it was a rather tedious task.
Ezio Melottic0deec12010-04-05 03:51:38 +000017Therefore, many frameworks and helper tools have been created to assist
18developers in creating faster and more robust sites. This HOWTO describes
19some of the methods used to combine Python with a web server to create
20dynamic content. It is not meant as a complete introduction, as this topic is
21far too broad to be covered in one single document. However, a short overview
22of the most popular libraries is provided.
Georg Brandl0f3629d2008-09-07 17:00:17 +000023
24.. seealso::
25
Ezio Melottic0deec12010-04-05 03:51:38 +000026 While this HOWTO tries to give an overview of Python in the web, it cannot
27 always be as up to date as desired. Web development in Python is rapidly
28 moving forward, so the wiki page on `Web Programming
Georg Brandl06f3b3b2014-10-29 08:36:35 +010029 <https://wiki.python.org/moin/WebProgramming>`_ may be more in sync with
Georg Brandl0f3629d2008-09-07 17:00:17 +000030 recent development.
31
32
Ezio Melottic0deec12010-04-05 03:51:38 +000033The Low-Level View
Georg Brandl0f3629d2008-09-07 17:00:17 +000034==================
35
Ezio Melottic0deec12010-04-05 03:51:38 +000036When a user enters a web site, their browser makes a connection to the site's
37web server (this is called the *request*). The server looks up the file in the
Georg Brandl0f3629d2008-09-07 17:00:17 +000038file system and sends it back to the user's browser, which displays it (this is
Ezio Melottid72a6282010-03-23 23:26:21 +000039the *response*). This is roughly how the underlying protocol, HTTP, works.
Georg Brandl0f3629d2008-09-07 17:00:17 +000040
Ezio Melottic0deec12010-04-05 03:51:38 +000041Dynamic web sites are not based on files in the file system, but rather on
42programs which are run by the web server when a request comes in, and which
43*generate* the content that is returned to the user. They can do all sorts of
44useful things, like display the postings of a bulletin board, show your email,
45configure software, or just display the current time. These programs can be
46written in any programming language the server supports. Since most servers
47support Python, it is easy to use Python to create dynamic web sites.
Georg Brandl0f3629d2008-09-07 17:00:17 +000048
Ezio Melottic0deec12010-04-05 03:51:38 +000049Most HTTP servers are written in C or C++, so they cannot execute Python code
50directly -- a bridge is needed between the server and the program. These
51bridges, or rather interfaces, define how programs interact with the server.
52There have been numerous attempts to create the best possible interface, but
53there are only a few worth mentioning.
Georg Brandl0f3629d2008-09-07 17:00:17 +000054
Ezio Melottic0deec12010-04-05 03:51:38 +000055Not every web server supports every interface. Many web servers only support
56old, now-obsolete interfaces; however, they can often be extended using
57third-party modules to support newer ones.
Georg Brandl0f3629d2008-09-07 17:00:17 +000058
59
60Common Gateway Interface
61------------------------
62
Ezio Melottic0deec12010-04-05 03:51:38 +000063This interface, most commonly referred to as "CGI", is the oldest, and is
64supported by nearly every web server out of the box. Programs using CGI to
65communicate with their web server need to be started by the server for every
66request. So, every request starts a new Python interpreter -- which takes some
67time to start up -- thus making the whole interface only usable for low load
68situations.
Georg Brandl0f3629d2008-09-07 17:00:17 +000069
Ezio Melottic0deec12010-04-05 03:51:38 +000070The upside of CGI is that it is simple -- writing a Python program which uses
71CGI is a matter of about three lines of code. This simplicity comes at a
72price: it does very few things to help the developer.
Georg Brandl0f3629d2008-09-07 17:00:17 +000073
Ezio Melottic0deec12010-04-05 03:51:38 +000074Writing CGI programs, while still possible, is no longer recommended. With
75:ref:`WSGI <WSGI>`, a topic covered later in this document, it is possible to write
76programs that emulate CGI, so they can be run as CGI if no better option is
77available.
Georg Brandl0f3629d2008-09-07 17:00:17 +000078
79.. seealso::
80
81 The Python standard library includes some modules that are helpful for
82 creating plain CGI programs:
83
84 * :mod:`cgi` -- Handling of user input in CGI scripts
Ezio Melottic0deec12010-04-05 03:51:38 +000085 * :mod:`cgitb` -- Displays nice tracebacks when errors happen in CGI
Georg Brandl0f3629d2008-09-07 17:00:17 +000086 applications, instead of presenting a "500 Internal Server Error" message
87
88 The Python wiki features a page on `CGI scripts
Georg Brandl06f3b3b2014-10-29 08:36:35 +010089 <https://wiki.python.org/moin/CgiScripts>`_ with some additional information
Georg Brandl0f3629d2008-09-07 17:00:17 +000090 about CGI in Python.
91
Georg Brandlc62ef8b2009-01-03 20:55:06 +000092
Georg Brandl0f3629d2008-09-07 17:00:17 +000093Simple script for testing CGI
94^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
95
96To test whether your web server works with CGI, you can use this short and
97simple CGI program::
98
99 #!/usr/bin/env python
100 # -*- coding: UTF-8 -*-
101
102 # enable debugging
Georg Brandl6b5dbaa2009-02-20 08:22:21 +0000103 import cgitb
104 cgitb.enable()
Georg Brandl0f3629d2008-09-07 17:00:17 +0000105
106 print "Content-Type: text/plain;charset=utf-8"
107 print
108
109 print "Hello World!"
110
Ezio Melottic0deec12010-04-05 03:51:38 +0000111Depending on your web server configuration, you may need to save this code with
112a ``.py`` or ``.cgi`` extension. Additionally, this file may also need to be
113in a ``cgi-bin`` folder, for security reasons.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000114
115You might wonder what the ``cgitb`` line is about. This line makes it possible
116to display a nice traceback instead of just crashing and displaying an "Internal
117Server Error" in the user's browser. This is useful for debugging, but it might
Ezio Melottic0deec12010-04-05 03:51:38 +0000118risk exposing some confidential data to the user. You should not use ``cgitb``
119in production code for this reason. You should *always* catch exceptions, and
Georg Brandl0f3629d2008-09-07 17:00:17 +0000120display proper error pages -- end-users don't like to see nondescript "Internal
121Server Errors" in their browsers.
122
123
124Setting up CGI on your own server
125^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
126
127If you don't have your own web server, this does not apply to you. You can
Ezio Melottic0deec12010-04-05 03:51:38 +0000128check whether it works as-is, and if not you will need to talk to the
129administrator of your web server. If it is a big host, you can try filing a
130ticket asking for Python support.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000131
Ezio Melottic0deec12010-04-05 03:51:38 +0000132If you are your own administrator or want to set up CGI for testing purposes on
133your own computers, you have to configure it by yourself. There is no single
134way to configure CGI, as there are many web servers with different
135configuration options. Currently the most widely used free web server is
136`Apache HTTPd <http://httpd.apache.org/>`_, or Apache for short. Apache can be
137easily installed on nearly every system using the system's package management
138tool. `lighttpd <http://www.lighttpd.net>`_ is another alternative and is
139said to have better performance. On many systems this server can also be
140installed using the package management tool, so manually compiling the web
141server may not be needed.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000142
Ezio Melottic0deec12010-04-05 03:51:38 +0000143* On Apache you can take a look at the `Dynamic Content with CGI
Georg Brandl0f3629d2008-09-07 17:00:17 +0000144 <http://httpd.apache.org/docs/2.2/howto/cgi.html>`_ tutorial, where everything
145 is described. Most of the time it is enough just to set ``+ExecCGI``. The
146 tutorial also describes the most common gotchas that might arise.
Ezio Melottic0deec12010-04-05 03:51:38 +0000147
Georg Brandl0f3629d2008-09-07 17:00:17 +0000148* On lighttpd you need to use the `CGI module
Georg Brandl0ffb4622014-10-29 09:37:43 +0100149 <http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModCGI>`_\ , which can be configured
Georg Brandl0f3629d2008-09-07 17:00:17 +0000150 in a straightforward way. It boils down to setting ``cgi.assign`` properly.
151
152
153Common problems with CGI scripts
154^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
155
Ezio Melottic0deec12010-04-05 03:51:38 +0000156Using CGI sometimes leads to small annoyances while trying to get these
157scripts to run. Sometimes a seemingly correct script does not work as
158expected, the cause being some small hidden problem that's difficult to spot.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000159
Ezio Melottic0deec12010-04-05 03:51:38 +0000160Some of these potential problems are:
Georg Brandl0f3629d2008-09-07 17:00:17 +0000161
Ezio Melottic0deec12010-04-05 03:51:38 +0000162* The Python script is not marked as executable. When CGI scripts are not
163 executable most web servers will let the user download it, instead of
Georg Brandl0f3629d2008-09-07 17:00:17 +0000164 running it and sending the output to the user. For CGI scripts to run
Ezio Melottic0deec12010-04-05 03:51:38 +0000165 properly on Unix-like operating systems, the ``+x`` bit needs to be set.
166 Using ``chmod a+x your_script.py`` may solve this problem.
167
168* On a Unix-like system, The line endings in the program file must be Unix
169 style line endings. This is important because the web server checks the
170 first line of the script (called shebang) and tries to run the program
171 specified there. It gets easily confused by Windows line endings (Carriage
172 Return & Line Feed, also called CRLF), so you have to convert the file to
173 Unix line endings (only Line Feed, LF). This can be done automatically by
174 uploading the file via FTP in text mode instead of binary mode, but the
175 preferred way is just telling your editor to save the files with Unix line
176 endings. Most editors support this.
177
178* Your web server must be able to read the file, and you need to make sure the
179 permissions are correct. On unix-like systems, the server often runs as user
180 and group ``www-data``, so it might be worth a try to change the file
181 ownership, or making the file world readable by using ``chmod a+r
182 your_script.py``.
183
184* The web server must know that the file you're trying to access is a CGI script.
185 Check the configuration of your web server, as it may be configured
186 to expect a specific file extension for CGI scripts.
187
188* On Unix-like systems, the path to the interpreter in the shebang
189 (``#!/usr/bin/env python``) must be correct. This line calls
190 ``/usr/bin/env`` to find Python, but it will fail if there is no
191 ``/usr/bin/env``, or if Python is not in the web server's path. If you know
192 where your Python is installed, you can also use that full path. The
193 commands ``whereis python`` and ``type -p python`` could help you find
194 where it is installed. Once you know the path, you can change the shebang
195 accordingly: ``#!/usr/bin/python``.
196
Georg Brandl0f3629d2008-09-07 17:00:17 +0000197* The file must not contain a BOM (Byte Order Mark). The BOM is meant for
Ezio Melottic0deec12010-04-05 03:51:38 +0000198 determining the byte order of UTF-16 and UTF-32 encodings, but some editors
199 write this also into UTF-8 files. The BOM interferes with the shebang line,
200 so be sure to tell your editor not to write the BOM.
201
202* If the web server is using :ref:`mod-python`, ``mod_python`` may be having
203 problems. ``mod_python`` is able to handle CGI scripts by itself, but it can
204 also be a source of issues.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000205
206
207.. _mod-python:
208
209mod_python
210----------
211
212People coming from PHP often find it hard to grasp how to use Python in the web.
Georg Brandl0ffb4622014-10-29 09:37:43 +0100213Their first thought is mostly `mod_python <http://modpython.org/>`_\ ,
Ezio Melottic0deec12010-04-05 03:51:38 +0000214because they think that this is the equivalent to ``mod_php``. Actually, there
215are many differences. What ``mod_python`` does is embed the interpreter into
216the Apache process, thus speeding up requests by not having to start a Python
217interpreter for each request. On the other hand, it is not "Python intermixed
218with HTML" in the way that PHP is often intermixed with HTML. The Python
219equivalent of that is a template engine. ``mod_python`` itself is much more
220powerful and provides more access to Apache internals. It can emulate CGI,
221work in a "Python Server Pages" mode (similar to JSP) which is "HTML
222intermingled with Python", and it has a "Publisher" which designates one file
223to accept all requests and decide what to do with them.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000224
Ezio Melottic0deec12010-04-05 03:51:38 +0000225``mod_python`` does have some problems. Unlike the PHP interpreter, the Python
226interpreter uses caching when executing files, so changes to a file will
227require the web server to be restarted. Another problem is the basic concept
228-- Apache starts child processes to handle the requests, and unfortunately
229every child process needs to load the whole Python interpreter even if it does
230not use it. This makes the whole web server slower. Another problem is that,
231because ``mod_python`` is linked against a specific version of ``libpython``,
232it is not possible to switch from an older version to a newer (e.g. 2.4 to 2.5)
233without recompiling ``mod_python``. ``mod_python`` is also bound to the Apache
234web server, so programs written for ``mod_python`` cannot easily run on other
235web servers.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000236
Ezio Melottic0deec12010-04-05 03:51:38 +0000237These are the reasons why ``mod_python`` should be avoided when writing new
238programs. In some circumstances it still might be a good idea to use
239``mod_python`` for deployment, but WSGI makes it possible to run WSGI programs
240under ``mod_python`` as well.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000241
242
243FastCGI and SCGI
244----------------
245
246FastCGI and SCGI try to solve the performance problem of CGI in another way.
247Instead of embedding the interpreter into the web server, they create
Ezio Melottic0deec12010-04-05 03:51:38 +0000248long-running background processes. There is still a module in the web server
249which makes it possible for the web server to "speak" with the background
250process. As the background process is independent of the server, it can be
251written in any language, including Python. The language just needs to have a
252library which handles the communication with the webserver.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000253
254The difference between FastCGI and SCGI is very small, as SCGI is essentially
Ezio Melottic0deec12010-04-05 03:51:38 +0000255just a "simpler FastCGI". As the web server support for SCGI is limited,
Georg Brandl0f3629d2008-09-07 17:00:17 +0000256most people use FastCGI instead, which works the same way. Almost everything
Ezio Melottic0deec12010-04-05 03:51:38 +0000257that applies to SCGI also applies to FastCGI as well, so we'll only cover
Georg Brandl0f3629d2008-09-07 17:00:17 +0000258the latter.
259
Ezio Melottic0deec12010-04-05 03:51:38 +0000260These days, FastCGI is never used directly. Just like ``mod_python``, it is only
Georg Brandl0f3629d2008-09-07 17:00:17 +0000261used for the deployment of WSGI applications.
262
Georg Brandl0f3629d2008-09-07 17:00:17 +0000263
264Setting up FastCGI
265^^^^^^^^^^^^^^^^^^
266
Ezio Melottic0deec12010-04-05 03:51:38 +0000267Each web server requires a specific module.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000268
Ezio Melottic0deec12010-04-05 03:51:38 +0000269* Apache has both `mod_fastcgi <http://www.fastcgi.com/drupal/>`_ and `mod_fcgid
Georg Brandl6e0b44e2016-02-26 19:37:12 +0100270 <https://httpd.apache.org/mod_fcgid/>`_. ``mod_fastcgi`` is the original one, but it
Ezio Melottic0deec12010-04-05 03:51:38 +0000271 has some licensing issues, which is why it is sometimes considered non-free.
272 ``mod_fcgid`` is a smaller, compatible alternative. One of these modules needs
Georg Brandl0f3629d2008-09-07 17:00:17 +0000273 to be loaded by Apache.
Ezio Melottic0deec12010-04-05 03:51:38 +0000274
Georg Brandl0f3629d2008-09-07 17:00:17 +0000275* lighttpd ships its own `FastCGI module
Georg Brandl0ffb4622014-10-29 09:37:43 +0100276 <http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModFastCGI>`_ as well as an
277 `SCGI module <http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModSCGI>`_.
Ezio Melottic0deec12010-04-05 03:51:38 +0000278
279* `nginx <http://nginx.org/>`_ also supports `FastCGI
Georg Brandl6e0b44e2016-02-26 19:37:12 +0100280 <https://www.nginx.com/resources/wiki/start/topics/examples/simplepythonfcgi/>`_.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000281
282Once you have installed and configured the module, you can test it with the
283following WSGI-application::
284
285 #!/usr/bin/env python
286 # -*- coding: UTF-8 -*-
287
288 from cgi import escape
Benjamin Petersona7b55a32009-02-20 03:31:23 +0000289 import sys, os
Georg Brandl0f3629d2008-09-07 17:00:17 +0000290 from flup.server.fcgi import WSGIServer
291
292 def app(environ, start_response):
293 start_response('200 OK', [('Content-Type', 'text/html')])
294
295 yield '<h1>FastCGI Environment</h1>'
296 yield '<table>'
297 for k, v in sorted(environ.items()):
Serhiy Storchaka12d547a2016-05-10 13:45:32 +0300298 yield '<tr><th>%s</th><td>%s</td></tr>' % (escape(k), escape(v))
Georg Brandl0f3629d2008-09-07 17:00:17 +0000299 yield '</table>'
300
301 WSGIServer(app).run()
302
303This is a simple WSGI application, but you need to install `flup
Georg Brandl06f3b3b2014-10-29 08:36:35 +0100304<https://pypi.python.org/pypi/flup/1.0>`_ first, as flup handles the low level
Georg Brandl0f3629d2008-09-07 17:00:17 +0000305FastCGI access.
306
307.. seealso::
308
Georg Brandl6e0b44e2016-02-26 19:37:12 +0100309 There is some documentation on `setting up Django with WSGI
310 <https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/>`_, most of
Ezio Melottic0deec12010-04-05 03:51:38 +0000311 which can be reused for other WSGI-compliant frameworks and libraries.
312 Only the ``manage.py`` part has to be changed, the example used here can be
313 used instead. Django does more or less the exact same thing.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000314
315
316mod_wsgi
317--------
318
Ezio Melottic0deec12010-04-05 03:51:38 +0000319`mod_wsgi <http://code.google.com/p/modwsgi/>`_ is an attempt to get rid of the
320low level gateways. Given that FastCGI, SCGI, and mod_python are mostly used to
321deploy WSGI applications, mod_wsgi was started to directly embed WSGI applications
322into the Apache web server. mod_wsgi is specifically designed to host WSGI
323applications. It makes the deployment of WSGI applications much easier than
324deployment using other low level methods, which need glue code. The downside
325is that mod_wsgi is limited to the Apache web server; other servers would need
Georg Brandl0f3629d2008-09-07 17:00:17 +0000326their own implementations of mod_wsgi.
327
Ezio Melottic0deec12010-04-05 03:51:38 +0000328mod_wsgi supports two modes: embedded mode, in which it integrates with the
329Apache process, and daemon mode, which is more FastCGI-like. Unlike FastCGI,
330mod_wsgi handles the worker-processes by itself, which makes administration
Georg Brandl0f3629d2008-09-07 17:00:17 +0000331easier.
332
333
334.. _WSGI:
335
336Step back: WSGI
337===============
338
Ezio Melottic0deec12010-04-05 03:51:38 +0000339WSGI has already been mentioned several times, so it has to be something
340important. In fact it really is, and now it is time to explain it.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000341
Ezio Melottic0deec12010-04-05 03:51:38 +0000342The *Web Server Gateway Interface*, or WSGI for short, is defined in
343:pep:`333` and is currently the best way to do Python web programming. While
344it is great for programmers writing frameworks, a normal web developer does not
345need to get in direct contact with it. When choosing a framework for web
346development it is a good idea to choose one which supports WSGI.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000347
Ezio Melottic0deec12010-04-05 03:51:38 +0000348The big benefit of WSGI is the unification of the application programming
349interface. When your program is compatible with WSGI -- which at the outer
350level means that the framework you are using has support for WSGI -- your
351program can be deployed via any web server interface for which there are WSGI
352wrappers. You do not need to care about whether the application user uses
353mod_python or FastCGI or mod_wsgi -- with WSGI your application will work on
354any gateway interface. The Python standard library contains its own WSGI
355server, :mod:`wsgiref`, which is a small web server that can be used for
356testing.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000357
Ezio Melottic0deec12010-04-05 03:51:38 +0000358A really great WSGI feature is middleware. Middleware is a layer around your
359program which can add various functionality to it. There is quite a bit of
Georg Brandl6e0b44e2016-02-26 19:37:12 +0100360`middleware <https://wsgi.readthedocs.org/en/latest/libraries.html>`_ already
Ezio Melottic0deec12010-04-05 03:51:38 +0000361available. For example, instead of writing your own session management (HTTP
362is a stateless protocol, so to associate multiple HTTP requests with a single
363user your application must create and manage such state via a session), you can
364just download middleware which does that, plug it in, and get on with coding
365the unique parts of your application. The same thing with compression -- there
366is existing middleware which handles compressing your HTML using gzip to save
Berker Peksag6f959d02016-09-29 02:32:51 +0300367on your server's bandwidth. Authentication is another problem that is easily
368solved using existing middleware.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000369
Ezio Melottic0deec12010-04-05 03:51:38 +0000370Although WSGI may seem complex, the initial phase of learning can be very
371rewarding because WSGI and the associated middleware already have solutions to
372many problems that might arise while developing web sites.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000373
374
375WSGI Servers
376------------
377
378The code that is used to connect to various low level gateways like CGI or
Ezio Melottic0deec12010-04-05 03:51:38 +0000379mod_python is called a *WSGI server*. One of these servers is ``flup``, which
380supports FastCGI and SCGI, as well as `AJP
Georg Brandl6e0b44e2016-02-26 19:37:12 +0100381<https://en.wikipedia.org/wiki/Apache_JServ_Protocol>`_. Some of these servers
Ezio Melottic0deec12010-04-05 03:51:38 +0000382are written in Python, as ``flup`` is, but there also exist others which are
Georg Brandl0f3629d2008-09-07 17:00:17 +0000383written in C and can be used as drop-in replacements.
384
Ezio Melottic0deec12010-04-05 03:51:38 +0000385There are many servers already available, so a Python web application
386can be deployed nearly anywhere. This is one big advantage that Python has
387compared with other web technologies.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000388
389.. seealso::
390
Sandro Tosi117e1f02011-12-31 18:13:59 +0100391 A good overview of WSGI-related code can be found in the `WSGI homepage
Georg Brandl6e0b44e2016-02-26 19:37:12 +0100392 <https://wsgi.readthedocs.org/>`_, which contains an extensive list of `WSGI servers
393 <https://wsgi.readthedocs.org/en/latest/servers.html>`_ which can be used by *any* application
Georg Brandl0f3629d2008-09-07 17:00:17 +0000394 supporting WSGI.
395
396 You might be interested in some WSGI-supporting modules already contained in
397 the standard library, namely:
Georg Brandlc62ef8b2009-01-03 20:55:06 +0000398
Georg Brandl0f3629d2008-09-07 17:00:17 +0000399 * :mod:`wsgiref` -- some tiny utilities and servers for WSGI
400
401
402Case study: MoinMoin
403--------------------
404
Ezio Melottic0deec12010-04-05 03:51:38 +0000405What does WSGI give the web application developer? Let's take a look at
406an application that's been around for a while, which was written in
407Python without using WSGI.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000408
Ezio Melottic0deec12010-04-05 03:51:38 +0000409One of the most widely used wiki software packages is `MoinMoin
Georg Brandl6e0b44e2016-02-26 19:37:12 +0100410<https://moinmo.in/>`_. It was created in 2000, so it predates WSGI by about
Ezio Melottic0deec12010-04-05 03:51:38 +0000411three years. Older versions needed separate code to run on CGI, mod_python,
412FastCGI and standalone.
413
414It now includes support for WSGI. Using WSGI, it is possible to deploy
415MoinMoin on any WSGI compliant server, with no additional glue code.
416Unlike the pre-WSGI versions, this could include WSGI servers that the
417authors of MoinMoin know nothing about.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000418
419
Ezio Melottic0deec12010-04-05 03:51:38 +0000420Model-View-Controller
Georg Brandl0f3629d2008-09-07 17:00:17 +0000421=====================
422
Ezio Melottic0deec12010-04-05 03:51:38 +0000423The term *MVC* is often encountered in statements such as "framework *foo*
424supports MVC". MVC is more about the overall organization of code, rather than
425any particular API. Many web frameworks use this model to help the developer
426bring structure to their program. Bigger web applications can have lots of
427code, so it is a good idea to have an effective structure right from the beginning.
428That way, even users of other frameworks (or even other languages, since MVC is
429not Python-specific) can easily understand the code, given that they are
430already familiar with the MVC structure.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000431
432MVC stands for three components:
433
Ezio Melottic0deec12010-04-05 03:51:38 +0000434* The *model*. This is the data that will be displayed and modified. In
435 Python frameworks, this component is often represented by the classes used by
436 an object-relational mapper.
437
Georg Brandl0f3629d2008-09-07 17:00:17 +0000438* The *view*. This component's job is to display the data of the model to the
Ezio Melottic0deec12010-04-05 03:51:38 +0000439 user. Typically this component is implemented via templates.
440
Georg Brandl0f3629d2008-09-07 17:00:17 +0000441* The *controller*. This is the layer between the user and the model. The
Ezio Melottic0deec12010-04-05 03:51:38 +0000442 controller reacts to user actions (like opening some specific URL), tells
443 the model to modify the data if necessary, and tells the view code what to
444 display,
Georg Brandl0f3629d2008-09-07 17:00:17 +0000445
446While one might think that MVC is a complex design pattern, in fact it is not.
447It is used in Python because it has turned out to be useful for creating clean,
448maintainable web sites.
449
450.. note::
451
452 While not all Python frameworks explicitly support MVC, it is often trivial
Mark Dickinson3e4caeb2009-02-21 20:27:01 +0000453 to create a web site which uses the MVC pattern by separating the data logic
Georg Brandl0f3629d2008-09-07 17:00:17 +0000454 (the model) from the user interaction logic (the controller) and the
Mark Dickinson3e4caeb2009-02-21 20:27:01 +0000455 templates (the view). That's why it is important not to write unnecessary
Ezio Melottic0deec12010-04-05 03:51:38 +0000456 Python code in the templates -- it works against the MVC model and creates
457 chaos in the code base, making it harder to understand and modify.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000458
459.. seealso::
460
Ezio Melottic0deec12010-04-05 03:51:38 +0000461 The English Wikipedia has an article about the `Model-View-Controller pattern
Georg Brandl6e0b44e2016-02-26 19:37:12 +0100462 <https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller>`_. It includes a long
Ezio Melottic0deec12010-04-05 03:51:38 +0000463 list of web frameworks for various programming languages.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000464
465
Ezio Melottic0deec12010-04-05 03:51:38 +0000466Ingredients for Websites
467========================
Georg Brandl0f3629d2008-09-07 17:00:17 +0000468
Ezio Melottic0deec12010-04-05 03:51:38 +0000469Websites are complex constructs, so tools have been created to help web
470developers make their code easier to write and more maintainable. Tools like
471these exist for all web frameworks in all languages. Developers are not forced
472to use these tools, and often there is no "best" tool. It is worth learning
473about the available tools because they can greatly simplify the process of
474developing a web site.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000475
476
477.. seealso::
478
Ezio Melottic0deec12010-04-05 03:51:38 +0000479 There are far more components than can be presented here. The Python wiki
480 has a page about these components, called
Georg Brandl06f3b3b2014-10-29 08:36:35 +0100481 `Web Components <https://wiki.python.org/moin/WebComponents>`_.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000482
483
484Templates
485---------
486
Ezio Melottic0deec12010-04-05 03:51:38 +0000487Mixing of HTML and Python code is made possible by a few libraries. While
Georg Brandl0f3629d2008-09-07 17:00:17 +0000488convenient at first, it leads to horribly unmaintainable code. That's why
489templates exist. Templates are, in the simplest case, just HTML files with
Ezio Melottic0deec12010-04-05 03:51:38 +0000490placeholders. The HTML is sent to the user's browser after filling in the
Georg Brandl0f3629d2008-09-07 17:00:17 +0000491placeholders.
492
Ezio Melottic0deec12010-04-05 03:51:38 +0000493Python already includes two ways to build simple templates::
Georg Brandl0f3629d2008-09-07 17:00:17 +0000494
Ezio Melottic0deec12010-04-05 03:51:38 +0000495 >>> template = "<html><body><h1>Hello %s!</h1></body></html>"
496 >>> print template % "Reader"
497 <html><body><h1>Hello Reader!</h1></body></html>
Georg Brandl0f3629d2008-09-07 17:00:17 +0000498
Ezio Melottic0deec12010-04-05 03:51:38 +0000499 >>> from string import Template
500 >>> template = Template("<html><body><h1>Hello ${name}</h1></body></html>")
501 >>> print template.substitute(dict(name='Dinsdale'))
502 <html><body><h1>Hello Dinsdale!</h1></body></html>
Georg Brandl0f3629d2008-09-07 17:00:17 +0000503
Ezio Melottic0deec12010-04-05 03:51:38 +0000504To generate complex HTML based on non-trivial model data, conditional
505and looping constructs like Python's *for* and *if* are generally needed.
506*Template engines* support templates of this complexity.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000507
Ezio Melottic0deec12010-04-05 03:51:38 +0000508There are a lot of template engines available for Python which can be used with
509or without a `framework`_. Some of these define a plain-text programming
510language which is easy to learn, partly because it is limited in scope.
511Others use XML, and the template output is guaranteed to be always be valid
512XML. There are many other variations.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000513
Ezio Melottic0deec12010-04-05 03:51:38 +0000514Some `frameworks`_ ship their own template engine or recommend one in
515particular. In the absence of a reason to use a different template engine,
516using the one provided by or recommended by the framework is a good idea.
Georg Brandlc62ef8b2009-01-03 20:55:06 +0000517
Ezio Melottic0deec12010-04-05 03:51:38 +0000518Popular template engines include:
Georg Brandl0f3629d2008-09-07 17:00:17 +0000519
Ezio Melottic0deec12010-04-05 03:51:38 +0000520 * `Mako <http://www.makotemplates.org/>`_
521 * `Genshi <http://genshi.edgewall.org/>`_
Georg Brandl0f5d6c02014-10-29 10:57:37 +0100522 * `Jinja <http://jinja.pocoo.org/>`_
Georg Brandl0f3629d2008-09-07 17:00:17 +0000523
524.. seealso::
525
Ezio Melotti056f33d2010-11-16 21:08:14 +0000526 There are many template engines competing for attention, because it is
Ezio Melottic0deec12010-04-05 03:51:38 +0000527 pretty easy to create them in Python. The page `Templating
Georg Brandl06f3b3b2014-10-29 08:36:35 +0100528 <https://wiki.python.org/moin/Templating>`_ in the wiki lists a big,
Ezio Melottic0deec12010-04-05 03:51:38 +0000529 ever-growing number of these. The three listed above are considered "second
530 generation" template engines and are a good place to start.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000531
532
533Data persistence
534----------------
535
Ezio Melottic0deec12010-04-05 03:51:38 +0000536*Data persistence*, while sounding very complicated, is just about storing data.
537This data might be the text of blog entries, the postings on a bulletin board or
538the text of a wiki page. There are, of course, a number of different ways to store
539information on a web server.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000540
Ezio Melottic0deec12010-04-05 03:51:38 +0000541Often, relational database engines like `MySQL <http://www.mysql.com/>`_ or
542`PostgreSQL <http://www.postgresql.org/>`_ are used because of their good
543performance when handling very large databases consisting of millions of
544entries. There is also a small database engine called `SQLite
545<http://www.sqlite.org/>`_, which is bundled with Python in the :mod:`sqlite3`
546module, and which uses only one file. It has no other dependencies. For
547smaller sites SQLite is just enough.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000548
Ezio Melottic0deec12010-04-05 03:51:38 +0000549Relational databases are *queried* using a language called `SQL
Georg Brandl6e0b44e2016-02-26 19:37:12 +0100550<https://en.wikipedia.org/wiki/SQL>`_. Python programmers in general do not
Ezio Melottic0deec12010-04-05 03:51:38 +0000551like SQL too much, as they prefer to work with objects. It is possible to save
552Python objects into a database using a technology called `ORM
Georg Brandl6e0b44e2016-02-26 19:37:12 +0100553<https://en.wikipedia.org/wiki/Object-relational_mapping>`_ (Object Relational
Ezio Melottic0deec12010-04-05 03:51:38 +0000554Mapping). ORM translates all object-oriented access into SQL code under the
555hood, so the developer does not need to think about it. Most `frameworks`_ use
556ORMs, and it works quite well.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000557
Ezio Melottic0deec12010-04-05 03:51:38 +0000558A second possibility is storing data in normal, plain text files (some
559times called "flat files"). This is very easy for simple sites,
560but can be difficult to get right if the web site is performing many
561updates to the stored data.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000562
Ezio Melottic0deec12010-04-05 03:51:38 +0000563A third possibility are object oriented databases (also called "object
564databases"). These databases store the object data in a form that closely
565parallels the way the objects are structured in memory during program
566execution. (By contrast, ORMs store the object data as rows of data in tables
567and relations between those rows.) Storing the objects directly has the
568advantage that nearly all objects can be saved in a straightforward way, unlike
569in relational databases where some objects are very hard to represent.
570
571`Frameworks`_ often give hints on which data storage method to choose. It is
572usually a good idea to stick to the data store recommended by the framework
573unless the application has special requirements better satisfied by an
574alternate storage mechanism.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000575
576.. seealso::
577
Georg Brandl06f3b3b2014-10-29 08:36:35 +0100578 * `Persistence Tools <https://wiki.python.org/moin/PersistenceTools>`_ lists
Ezio Melottic0deec12010-04-05 03:51:38 +0000579 possibilities on how to save data in the file system. Some of these
580 modules are part of the standard library
581
Georg Brandl06f3b3b2014-10-29 08:36:35 +0100582 * `Database Programming <https://wiki.python.org/moin/DatabaseProgramming>`_
Ezio Melottic0deec12010-04-05 03:51:38 +0000583 helps with choosing a method for saving data
584
585 * `SQLAlchemy <http://www.sqlalchemy.org/>`_, the most powerful OR-Mapper
Georg Brandl6e0b44e2016-02-26 19:37:12 +0100586 for Python, and `Elixir <https://pypi.python.org/pypi/Elixir>`_, which makes
Ezio Melottic0deec12010-04-05 03:51:38 +0000587 SQLAlchemy easier to use
588
Georg Brandl0f3629d2008-09-07 17:00:17 +0000589 * `SQLObject <http://www.sqlobject.org/>`_, another popular OR-Mapper
Ezio Melottic0deec12010-04-05 03:51:38 +0000590
Georg Brandl0f3629d2008-09-07 17:00:17 +0000591 * `ZODB <https://launchpad.net/zodb>`_ and `Durus
Georg Brandl6e0b44e2016-02-26 19:37:12 +0100592 <https://www.mems-exchange.org/software/>`_, two object oriented
Georg Brandl0f3629d2008-09-07 17:00:17 +0000593 databases
594
595
596.. _framework:
597
598Frameworks
599==========
600
Ezio Melottic0deec12010-04-05 03:51:38 +0000601The process of creating code to run web sites involves writing code to provide
602various services. The code to provide a particular service often works the
603same way regardless of the complexity or purpose of the web site in question.
604Abstracting these common solutions into reusable code produces what are called
605"frameworks" for web development. Perhaps the most well-known framework for
606web development is Ruby on Rails, but Python has its own frameworks. Some of
607these were partly inspired by Rails, or borrowed ideas from Rails, but many
608existed a long time before Rails.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000609
Ezio Melottic0deec12010-04-05 03:51:38 +0000610Originally Python web frameworks tended to incorporate all of the services
611needed to develop web sites as a giant, integrated set of tools. No two web
612frameworks were interoperable: a program developed for one could not be
613deployed on a different one without considerable re-engineering work. This led
614to the development of "minimalist" web frameworks that provided just the tools
615to communicate between the Python code and the http protocol, with all other
616services to be added on top via separate components. Some ad hoc standards
617were developed that allowed for limited interoperability between frameworks,
618such as a standard that allowed different template engines to be used
619interchangeably.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000620
Ezio Melottic0deec12010-04-05 03:51:38 +0000621Since the advent of WSGI, the Python web framework world has been evolving
622toward interoperability based on the WSGI standard. Now many web frameworks,
623whether "full stack" (providing all the tools one needs to deploy the most
624complex web sites) or minimalist, or anything in between, are built from
625collections of reusable components that can be used with more than one
626framework.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000627
Ezio Melottic0deec12010-04-05 03:51:38 +0000628The majority of users will probably want to select a "full stack" framework
629that has an active community. These frameworks tend to be well documented,
630and provide the easiest path to producing a fully functional web site in
631minimal time.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000632
633
634Some notable frameworks
635-----------------------
636
Ezio Melottic0deec12010-04-05 03:51:38 +0000637There are an incredible number of frameworks, so they cannot all be covered
638here. Instead we will briefly touch on some of the most popular.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000639
640
641Django
642^^^^^^
643
Georg Brandl0ffb4622014-10-29 09:37:43 +0100644`Django <https://www.djangoproject.com/>`_ is a framework consisting of several
Georg Brandl0f3629d2008-09-07 17:00:17 +0000645tightly coupled elements which were written from scratch and work together very
Ezio Melottic0deec12010-04-05 03:51:38 +0000646well. It includes an ORM which is quite powerful while being simple to use,
647and has a great online administration interface which makes it possible to edit
648the data in the database with a browser. The template engine is text-based and
649is designed to be usable for page designers who cannot write Python. It
650supports template inheritance and filters (which work like Unix pipes). Django
651has many handy features bundled, such as creation of RSS feeds or generic views,
652which make it possible to create web sites almost without writing any Python code.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000653
Ezio Melottic0deec12010-04-05 03:51:38 +0000654It has a big, international community, the members of which have created many
655web sites. There are also a lot of add-on projects which extend Django's normal
Georg Brandl0f3629d2008-09-07 17:00:17 +0000656functionality. This is partly due to Django's well written `online
Georg Brandl0ffb4622014-10-29 09:37:43 +0100657documentation <https://docs.djangoproject.com/>`_ and the `Django book
Georg Brandl0f3629d2008-09-07 17:00:17 +0000658<http://www.djangobook.com/>`_.
659
660
661.. note::
662
Ezio Melottic0deec12010-04-05 03:51:38 +0000663 Although Django is an MVC-style framework, it names the elements
Georg Brandl0f3629d2008-09-07 17:00:17 +0000664 differently, which is described in the `Django FAQ
Georg Brandl0ffb4622014-10-29 09:37:43 +0100665 <https://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>`_.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000666
667
668TurboGears
669^^^^^^^^^^
670
Ezio Melottic0deec12010-04-05 03:51:38 +0000671Another popular web framework for Python is `TurboGears
672<http://www.turbogears.org/>`_. TurboGears takes the approach of using already
673existing components and combining them with glue code to create a seamless
674experience. TurboGears gives the user flexibility in choosing components. For
675example the ORM and template engine can be changed to use packages different
676from those used by default.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000677
Georg Brandl6e0b44e2016-02-26 19:37:12 +0100678The documentation can be found in the `TurboGears documentation
679<https://turbogears.readthedocs.org/>`_, where links to screencasts can be found.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000680TurboGears has also an active user community which can respond to most related
Georg Brandl6e0b44e2016-02-26 19:37:12 +0100681questions. There is also a `TurboGears book <http://turbogears.org/1.0/docs/TGBooks.html>`_
Georg Brandl0f3629d2008-09-07 17:00:17 +0000682published, which is a good starting point.
683
Ezio Melottic0deec12010-04-05 03:51:38 +0000684The newest version of TurboGears, version 2.0, moves even further in direction
685of WSGI support and a component-based architecture. TurboGears 2 is based on
686the WSGI stack of another popular component-based web framework, `Pylons
Senthil Kumarandf0e8f92014-06-11 06:18:43 -0700687<http://www.pylonsproject.org/>`_.
Ezio Melottic0deec12010-04-05 03:51:38 +0000688
689
690Zope
691^^^^
692
693The Zope framework is one of the "old original" frameworks. Its current
694incarnation in Zope2 is a tightly integrated full-stack framework. One of its
695most interesting feature is its tight integration with a powerful object
696database called the `ZODB <https://launchpad.net/zodb>`_ (Zope Object Database).
697Because of its highly integrated nature, Zope wound up in a somewhat isolated
698ecosystem: code written for Zope wasn't very usable outside of Zope, and
699vice-versa. To solve this problem the Zope 3 effort was started. Zope 3
700re-engineers Zope as a set of more cleanly isolated components. This effort
701was started before the advent of the WSGI standard, but there is WSGI support
702for Zope 3 from the `Repoze <http://repoze.org/>`_ project. Zope components
703have many years of production use behind them, and the Zope 3 project gives
704access to these components to the wider Python community. There is even a
705separate framework based on the Zope components: `Grok
706<http://grok.zope.org/>`_.
707
Georg Brandl0ffb4622014-10-29 09:37:43 +0100708Zope is also the infrastructure used by the `Plone <https://plone.org/>`_ content
Ezio Melottic0deec12010-04-05 03:51:38 +0000709management system, one of the most powerful and popular content management
710systems available.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000711
712
713Other notable frameworks
714^^^^^^^^^^^^^^^^^^^^^^^^
715
Ezio Melottic0deec12010-04-05 03:51:38 +0000716Of course these are not the only frameworks that are available. There are
717many other frameworks worth mentioning.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000718
719Another framework that's already been mentioned is `Pylons`_. Pylons is much
Ezio Melottic0deec12010-04-05 03:51:38 +0000720like TurboGears, but with an even stronger emphasis on flexibility, which comes
Georg Brandl0f3629d2008-09-07 17:00:17 +0000721at the cost of being more difficult to use. Nearly every component can be
Mark Dickinson3e4caeb2009-02-21 20:27:01 +0000722exchanged, which makes it necessary to use the documentation of every single
Ezio Melottic0deec12010-04-05 03:51:38 +0000723component, of which there are many. Pylons builds upon `Paste
Georg Brandl0f3629d2008-09-07 17:00:17 +0000724<http://pythonpaste.org/>`_, an extensive set of tools which are handy for WSGI.
725
726And that's still not everything. The most up-to-date information can always be
727found in the Python wiki.
728
729.. seealso::
Georg Brandlc62ef8b2009-01-03 20:55:06 +0000730
Georg Brandl0f3629d2008-09-07 17:00:17 +0000731 The Python wiki contains an extensive list of `web frameworks
Georg Brandl06f3b3b2014-10-29 08:36:35 +0100732 <https://wiki.python.org/moin/WebFrameworks>`_.
Georg Brandl0f3629d2008-09-07 17:00:17 +0000733
734 Most frameworks also have their own mailing lists and IRC channels, look out
Benjamin Petersondf611a92014-12-12 09:56:33 -0500735 for these on the projects' web sites.