1 ******************************* 2 HOWTO Use Python in the web 3 ******************************* 4 5 :Author: Marek Kubica 6 7 .. topic:: Abstract 8 9 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 11 developing web sites. 12 13 14 Programming for the Web has become a hot topic since the rise of "Web 2.0", 15 which focuses on user-generated content on web sites. It has always been 16 possible to use Python for creating web sites, but it was a rather tedious task. 17 Therefore, many frameworks and helper tools have been created to assist 18 developers in creating faster and more robust sites. This HOWTO describes 19 some of the methods used to combine Python with a web server to create 20 dynamic content. It is not meant as a complete introduction, as this topic is 21 far too broad to be covered in one single document. However, a short overview 22 of the most popular libraries is provided. 23 24 .. seealso:: 25 26 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 29 <https://wiki.python.org/moin/WebProgramming>`_ may be more in sync with 30 recent development. 31 32 33 The Low-Level View 34 ================== 35 36 When a user enters a web site, their browser makes a connection to the site's 37 web server (this is called the *request*). The server looks up the file in the 38 file system and sends it back to the user's browser, which displays it (this is 39 the *response*). This is roughly how the underlying protocol, HTTP, works. 40 41 Dynamic web sites are not based on files in the file system, but rather on 42 programs 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 44 useful things, like display the postings of a bulletin board, show your email, 45 configure software, or just display the current time. These programs can be 46 written in any programming language the server supports. Since most servers 47 support Python, it is easy to use Python to create dynamic web sites. 48 49 Most HTTP servers are written in C or C++, so they cannot execute Python code 50 directly -- a bridge is needed between the server and the program. These 51 bridges, or rather interfaces, define how programs interact with the server. 52 There have been numerous attempts to create the best possible interface, but 53 there are only a few worth mentioning. 54 55 Not every web server supports every interface. Many web servers only support 56 old, now-obsolete interfaces; however, they can often be extended using 57 third-party modules to support newer ones. 58 59 60 Common Gateway Interface 61 ------------------------ 62 63 This interface, most commonly referred to as "CGI", is the oldest, and is 64 supported by nearly every web server out of the box. Programs using CGI to 65 communicate with their web server need to be started by the server for every 66 request. So, every request starts a new Python interpreter -- which takes some 67 time to start up -- thus making the whole interface only usable for low load 68 situations. 69 70 The upside of CGI is that it is simple -- writing a Python program which uses 71 CGI is a matter of about three lines of code. This simplicity comes at a 72 price: it does very few things to help the developer. 73 74 Writing 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 76 programs that emulate CGI, so they can be run as CGI if no better option is 77 available. 78 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 85 * :mod:`cgitb` -- Displays nice tracebacks when errors happen in CGI 86 applications, instead of presenting a "500 Internal Server Error" message 87 88 The Python wiki features a page on `CGI scripts 89 <https://wiki.python.org/moin/CgiScripts>`_ with some additional information 90 about CGI in Python. 91 92 93 Simple script for testing CGI 94 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 95 96 To test whether your web server works with CGI, you can use this short and 97 simple CGI program:: 98 99 #!/usr/bin/env python 100 # -*- coding: UTF-8 -*- 101 102 # enable debugging 103 import cgitb 104 cgitb.enable() 105 106 print "Content-Type: text/plain;charset=utf-8" 107 print 108 109 print "Hello World!" 110 111 Depending on your web server configuration, you may need to save this code with 112 a ``.py`` or ``.cgi`` extension. Additionally, this file may also need to be 113 in a ``cgi-bin`` folder, for security reasons. 114 115 You might wonder what the ``cgitb`` line is about. This line makes it possible 116 to display a nice traceback instead of just crashing and displaying an "Internal 117 Server Error" in the user's browser. This is useful for debugging, but it might 118 risk exposing some confidential data to the user. You should not use ``cgitb`` 119 in production code for this reason. You should *always* catch exceptions, and 120 display proper error pages -- end-users don't like to see nondescript "Internal 121 Server Errors" in their browsers. 122 123 124 Setting up CGI on your own server 125 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 126 127 If you don't have your own web server, this does not apply to you. You can 128 check whether it works as-is, and if not you will need to talk to the 129 administrator of your web server. If it is a big host, you can try filing a 130 ticket asking for Python support. 131 132 If you are your own administrator or want to set up CGI for testing purposes on 133 your own computers, you have to configure it by yourself. There is no single 134 way to configure CGI, as there are many web servers with different 135 configuration options. Currently the most widely used free web server is 136 `Apache HTTPd <http://httpd.apache.org/>`_, or Apache for short. Apache can be 137 easily installed on nearly every system using the system's package management 138 tool. `lighttpd <http://www.lighttpd.net>`_ is another alternative and is 139 said to have better performance. On many systems this server can also be 140 installed using the package management tool, so manually compiling the web 141 server may not be needed. 142 143 * On Apache you can take a look at the `Dynamic Content with CGI 144 <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. 147 148 * On lighttpd you need to use the `CGI module 149 <http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModCGI>`_\ , which can be configured 150 in a straightforward way. It boils down to setting ``cgi.assign`` properly. 151 152 153 Common problems with CGI scripts 154 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 155 156 Using CGI sometimes leads to small annoyances while trying to get these 157 scripts to run. Sometimes a seemingly correct script does not work as 158 expected, the cause being some small hidden problem that's difficult to spot. 159 160 Some of these potential problems are: 161 162 * 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 164 running it and sending the output to the user. For CGI scripts to run 165 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 197 * The file must not contain a BOM (Byte Order Mark). The BOM is meant for 198 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. 205 206 207 .. _mod-python: 208 209 mod_python 210 ---------- 211 212 People coming from PHP often find it hard to grasp how to use Python in the web. 213 Their first thought is mostly `mod_python <http://modpython.org/>`_\ , 214 because they think that this is the equivalent to ``mod_php``. Actually, there 215 are many differences. What ``mod_python`` does is embed the interpreter into 216 the Apache process, thus speeding up requests by not having to start a Python 217 interpreter for each request. On the other hand, it is not "Python intermixed 218 with HTML" in the way that PHP is often intermixed with HTML. The Python 219 equivalent of that is a template engine. ``mod_python`` itself is much more 220 powerful and provides more access to Apache internals. It can emulate CGI, 221 work in a "Python Server Pages" mode (similar to JSP) which is "HTML 222 intermingled with Python", and it has a "Publisher" which designates one file 223 to accept all requests and decide what to do with them. 224 225 ``mod_python`` does have some problems. Unlike the PHP interpreter, the Python 226 interpreter uses caching when executing files, so changes to a file will 227 require the web server to be restarted. Another problem is the basic concept 228 -- Apache starts child processes to handle the requests, and unfortunately 229 every child process needs to load the whole Python interpreter even if it does 230 not use it. This makes the whole web server slower. Another problem is that, 231 because ``mod_python`` is linked against a specific version of ``libpython``, 232 it is not possible to switch from an older version to a newer (e.g. 2.4 to 2.5) 233 without recompiling ``mod_python``. ``mod_python`` is also bound to the Apache 234 web server, so programs written for ``mod_python`` cannot easily run on other 235 web servers. 236 237 These are the reasons why ``mod_python`` should be avoided when writing new 238 programs. 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 240 under ``mod_python`` as well. 241 242 243 FastCGI and SCGI 244 ---------------- 245 246 FastCGI and SCGI try to solve the performance problem of CGI in another way. 247 Instead of embedding the interpreter into the web server, they create 248 long-running background processes. There is still a module in the web server 249 which makes it possible for the web server to "speak" with the background 250 process. As the background process is independent of the server, it can be 251 written in any language, including Python. The language just needs to have a 252 library which handles the communication with the webserver. 253 254 The difference between FastCGI and SCGI is very small, as SCGI is essentially 255 just a "simpler FastCGI". As the web server support for SCGI is limited, 256 most people use FastCGI instead, which works the same way. Almost everything 257 that applies to SCGI also applies to FastCGI as well, so we'll only cover 258 the latter. 259 260 These days, FastCGI is never used directly. Just like ``mod_python``, it is only 261 used for the deployment of WSGI applications. 262 263 264 Setting up FastCGI 265 ^^^^^^^^^^^^^^^^^^ 266 267 Each web server requires a specific module. 268 269 * Apache has both `mod_fastcgi <http://www.fastcgi.com/drupal/>`_ and `mod_fcgid 270 <https://httpd.apache.org/mod_fcgid/>`_. ``mod_fastcgi`` is the original one, but it 271 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 273 to be loaded by Apache. 274 275 * lighttpd ships its own `FastCGI module 276 <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>`_. 278 279 * `nginx <http://nginx.org/>`_ also supports `FastCGI 280 <https://www.nginx.com/resources/wiki/start/topics/examples/simplepythonfcgi/>`_. 281 282 Once you have installed and configured the module, you can test it with the 283 following WSGI-application:: 284 285 #!/usr/bin/env python 286 # -*- coding: UTF-8 -*- 287 288 from cgi import escape 289 import sys, os 290 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()): 298 yield '<tr><th>%s</th><td>%s</td></tr>' % (escape(k), escape(v)) 299 yield '</table>' 300 301 WSGIServer(app).run() 302 303 This is a simple WSGI application, but you need to install `flup 304 <https://pypi.org/project/flup/1.0>`_ first, as flup handles the low level 305 FastCGI access. 306 307 .. seealso:: 308 309 There is some documentation on `setting up Django with WSGI 310 <https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/>`_, most of 311 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. 314 315 316 mod_wsgi 317 -------- 318 319 `mod_wsgi <http://code.google.com/p/modwsgi/>`_ is an attempt to get rid of the 320 low level gateways. Given that FastCGI, SCGI, and mod_python are mostly used to 321 deploy WSGI applications, mod_wsgi was started to directly embed WSGI applications 322 into the Apache web server. mod_wsgi is specifically designed to host WSGI 323 applications. It makes the deployment of WSGI applications much easier than 324 deployment using other low level methods, which need glue code. The downside 325 is that mod_wsgi is limited to the Apache web server; other servers would need 326 their own implementations of mod_wsgi. 327 328 mod_wsgi supports two modes: embedded mode, in which it integrates with the 329 Apache process, and daemon mode, which is more FastCGI-like. Unlike FastCGI, 330 mod_wsgi handles the worker-processes by itself, which makes administration 331 easier. 332 333 334 .. _WSGI: 335 336 Step back: WSGI 337 =============== 338 339 WSGI has already been mentioned several times, so it has to be something 340 important. In fact it really is, and now it is time to explain it. 341 342 The *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 344 it is great for programmers writing frameworks, a normal web developer does not 345 need to get in direct contact with it. When choosing a framework for web 346 development it is a good idea to choose one which supports WSGI. 347 348 The big benefit of WSGI is the unification of the application programming 349 interface. When your program is compatible with WSGI -- which at the outer 350 level means that the framework you are using has support for WSGI -- your 351 program can be deployed via any web server interface for which there are WSGI 352 wrappers. You do not need to care about whether the application user uses 353 mod_python or FastCGI or mod_wsgi -- with WSGI your application will work on 354 any gateway interface. The Python standard library contains its own WSGI 355 server, :mod:`wsgiref`, which is a small web server that can be used for 356 testing. 357 358 A really great WSGI feature is middleware. Middleware is a layer around your 359 program which can add various functionality to it. There is quite a bit of 360 `middleware <https://wsgi.readthedocs.org/en/latest/libraries.html>`_ already 361 available. For example, instead of writing your own session management (HTTP 362 is a stateless protocol, so to associate multiple HTTP requests with a single 363 user your application must create and manage such state via a session), you can 364 just download middleware which does that, plug it in, and get on with coding 365 the unique parts of your application. The same thing with compression -- there 366 is existing middleware which handles compressing your HTML using gzip to save 367 on your server's bandwidth. Authentication is another problem that is easily 368 solved using existing middleware. 369 370 Although WSGI may seem complex, the initial phase of learning can be very 371 rewarding because WSGI and the associated middleware already have solutions to 372 many problems that might arise while developing web sites. 373 374 375 WSGI Servers 376 ------------ 377 378 The code that is used to connect to various low level gateways like CGI or 379 mod_python is called a *WSGI server*. One of these servers is ``flup``, which 380 supports FastCGI and SCGI, as well as `AJP 381 <https://en.wikipedia.org/wiki/Apache_JServ_Protocol>`_. Some of these servers 382 are written in Python, as ``flup`` is, but there also exist others which are 383 written in C and can be used as drop-in replacements. 384 385 There are many servers already available, so a Python web application 386 can be deployed nearly anywhere. This is one big advantage that Python has 387 compared with other web technologies. 388 389 .. seealso:: 390 391 A good overview of WSGI-related code can be found in the `WSGI homepage 392 <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 394 supporting WSGI. 395 396 You might be interested in some WSGI-supporting modules already contained in 397 the standard library, namely: 398 399 * :mod:`wsgiref` -- some tiny utilities and servers for WSGI 400 401 402 Case study: MoinMoin 403 -------------------- 404 405 What does WSGI give the web application developer? Let's take a look at 406 an application that's been around for a while, which was written in 407 Python without using WSGI. 408 409 One of the most widely used wiki software packages is `MoinMoin 410 <https://moinmo.in/>`_. It was created in 2000, so it predates WSGI by about 411 three years. Older versions needed separate code to run on CGI, mod_python, 412 FastCGI and standalone. 413 414 It now includes support for WSGI. Using WSGI, it is possible to deploy 415 MoinMoin on any WSGI compliant server, with no additional glue code. 416 Unlike the pre-WSGI versions, this could include WSGI servers that the 417 authors of MoinMoin know nothing about. 418 419 420 Model-View-Controller 421 ===================== 422 423 The term *MVC* is often encountered in statements such as "framework *foo* 424 supports MVC". MVC is more about the overall organization of code, rather than 425 any particular API. Many web frameworks use this model to help the developer 426 bring structure to their program. Bigger web applications can have lots of 427 code, so it is a good idea to have an effective structure right from the beginning. 428 That way, even users of other frameworks (or even other languages, since MVC is 429 not Python-specific) can easily understand the code, given that they are 430 already familiar with the MVC structure. 431 432 MVC stands for three components: 433 434 * 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 438 * The *view*. This component's job is to display the data of the model to the 439 user. Typically this component is implemented via templates. 440 441 * The *controller*. This is the layer between the user and the model. The 442 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, 445 446 While one might think that MVC is a complex design pattern, in fact it is not. 447 It is used in Python because it has turned out to be useful for creating clean, 448 maintainable web sites. 449 450 .. note:: 451 452 While not all Python frameworks explicitly support MVC, it is often trivial 453 to create a web site which uses the MVC pattern by separating the data logic 454 (the model) from the user interaction logic (the controller) and the 455 templates (the view). That's why it is important not to write unnecessary 456 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. 458 459 .. seealso:: 460 461 The English Wikipedia has an article about the `Model-View-Controller pattern 462 <https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller>`_. It includes a long 463 list of web frameworks for various programming languages. 464 465 466 Ingredients for Websites 467 ======================== 468 469 Websites are complex constructs, so tools have been created to help web 470 developers make their code easier to write and more maintainable. Tools like 471 these exist for all web frameworks in all languages. Developers are not forced 472 to use these tools, and often there is no "best" tool. It is worth learning 473 about the available tools because they can greatly simplify the process of 474 developing a web site. 475 476 477 .. seealso:: 478 479 There are far more components than can be presented here. The Python wiki 480 has a page about these components, called 481 `Web Components <https://wiki.python.org/moin/WebComponents>`_. 482 483 484 Templates 485 --------- 486 487 Mixing of HTML and Python code is made possible by a few libraries. While 488 convenient at first, it leads to horribly unmaintainable code. That's why 489 templates exist. Templates are, in the simplest case, just HTML files with 490 placeholders. The HTML is sent to the user's browser after filling in the 491 placeholders. 492 493 Python already includes two ways to build simple templates:: 494 495 >>> template = "<html><body><h1>Hello %s!</h1></body></html>" 496 >>> print template % "Reader" 497 <html><body><h1>Hello Reader!</h1></body></html> 498 499 >>> 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> 503 504 To generate complex HTML based on non-trivial model data, conditional 505 and looping constructs like Python's *for* and *if* are generally needed. 506 *Template engines* support templates of this complexity. 507 508 There are a lot of template engines available for Python which can be used with 509 or without a `framework`_. Some of these define a plain-text programming 510 language which is easy to learn, partly because it is limited in scope. 511 Others use XML, and the template output is guaranteed to be always be valid 512 XML. There are many other variations. 513 514 Some `frameworks`_ ship their own template engine or recommend one in 515 particular. In the absence of a reason to use a different template engine, 516 using the one provided by or recommended by the framework is a good idea. 517 518 Popular template engines include: 519 520 * `Mako <http://www.makotemplates.org/>`_ 521 * `Genshi <http://genshi.edgewall.org/>`_ 522 * `Jinja <http://jinja.pocoo.org/>`_ 523 524 .. seealso:: 525 526 There are many template engines competing for attention, because it is 527 pretty easy to create them in Python. The page `Templating 528 <https://wiki.python.org/moin/Templating>`_ in the wiki lists a big, 529 ever-growing number of these. The three listed above are considered "second 530 generation" template engines and are a good place to start. 531 532 533 Data persistence 534 ---------------- 535 536 *Data persistence*, while sounding very complicated, is just about storing data. 537 This data might be the text of blog entries, the postings on a bulletin board or 538 the text of a wiki page. There are, of course, a number of different ways to store 539 information on a web server. 540 541 Often, relational database engines like `MySQL <http://www.mysql.com/>`_ or 542 `PostgreSQL <http://www.postgresql.org/>`_ are used because of their good 543 performance when handling very large databases consisting of millions of 544 entries. There is also a small database engine called `SQLite 545 <http://www.sqlite.org/>`_, which is bundled with Python in the :mod:`sqlite3` 546 module, and which uses only one file. It has no other dependencies. For 547 smaller sites SQLite is just enough. 548 549 Relational databases are *queried* using a language called `SQL 550 <https://en.wikipedia.org/wiki/SQL>`_. Python programmers in general do not 551 like SQL too much, as they prefer to work with objects. It is possible to save 552 Python objects into a database using a technology called `ORM 553 <https://en.wikipedia.org/wiki/Object-relational_mapping>`_ (Object Relational 554 Mapping). ORM translates all object-oriented access into SQL code under the 555 hood, so the developer does not need to think about it. Most `frameworks`_ use 556 ORMs, and it works quite well. 557 558 A second possibility is storing data in normal, plain text files (some 559 times called "flat files"). This is very easy for simple sites, 560 but can be difficult to get right if the web site is performing many 561 updates to the stored data. 562 563 A third possibility are object oriented databases (also called "object 564 databases"). These databases store the object data in a form that closely 565 parallels the way the objects are structured in memory during program 566 execution. (By contrast, ORMs store the object data as rows of data in tables 567 and relations between those rows.) Storing the objects directly has the 568 advantage that nearly all objects can be saved in a straightforward way, unlike 569 in 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 572 usually a good idea to stick to the data store recommended by the framework 573 unless the application has special requirements better satisfied by an 574 alternate storage mechanism. 575 576 .. seealso:: 577 578 * `Persistence Tools <https://wiki.python.org/moin/PersistenceTools>`_ lists 579 possibilities on how to save data in the file system. Some of these 580 modules are part of the standard library 581 582 * `Database Programming <https://wiki.python.org/moin/DatabaseProgramming>`_ 583 helps with choosing a method for saving data 584 585 * `SQLAlchemy <http://www.sqlalchemy.org/>`_, the most powerful OR-Mapper 586 for Python, and `Elixir <https://pypi.org/project/Elixir>`_, which makes 587 SQLAlchemy easier to use 588 589 * `SQLObject <http://www.sqlobject.org/>`_, another popular OR-Mapper 590 591 * `ZODB <https://launchpad.net/zodb>`_ and `Durus 592 <https://www.mems-exchange.org/software/>`_, two object oriented 593 databases 594 595 596 .. _framework: 597 598 Frameworks 599 ========== 600 601 The process of creating code to run web sites involves writing code to provide 602 various services. The code to provide a particular service often works the 603 same way regardless of the complexity or purpose of the web site in question. 604 Abstracting these common solutions into reusable code produces what are called 605 "frameworks" for web development. Perhaps the most well-known framework for 606 web development is Ruby on Rails, but Python has its own frameworks. Some of 607 these were partly inspired by Rails, or borrowed ideas from Rails, but many 608 existed a long time before Rails. 609 610 Originally Python web frameworks tended to incorporate all of the services 611 needed to develop web sites as a giant, integrated set of tools. No two web 612 frameworks were interoperable: a program developed for one could not be 613 deployed on a different one without considerable re-engineering work. This led 614 to the development of "minimalist" web frameworks that provided just the tools 615 to communicate between the Python code and the http protocol, with all other 616 services to be added on top via separate components. Some ad hoc standards 617 were developed that allowed for limited interoperability between frameworks, 618 such as a standard that allowed different template engines to be used 619 interchangeably. 620 621 Since the advent of WSGI, the Python web framework world has been evolving 622 toward interoperability based on the WSGI standard. Now many web frameworks, 623 whether "full stack" (providing all the tools one needs to deploy the most 624 complex web sites) or minimalist, or anything in between, are built from 625 collections of reusable components that can be used with more than one 626 framework. 627 628 The majority of users will probably want to select a "full stack" framework 629 that has an active community. These frameworks tend to be well documented, 630 and provide the easiest path to producing a fully functional web site in 631 minimal time. 632 633 634 Some notable frameworks 635 ----------------------- 636 637 There are an incredible number of frameworks, so they cannot all be covered 638 here. Instead we will briefly touch on some of the most popular. 639 640 641 Django 642 ^^^^^^ 643 644 `Django <https://www.djangoproject.com/>`_ is a framework consisting of several 645 tightly coupled elements which were written from scratch and work together very 646 well. It includes an ORM which is quite powerful while being simple to use, 647 and has a great online administration interface which makes it possible to edit 648 the data in the database with a browser. The template engine is text-based and 649 is designed to be usable for page designers who cannot write Python. It 650 supports template inheritance and filters (which work like Unix pipes). Django 651 has many handy features bundled, such as creation of RSS feeds or generic views, 652 which make it possible to create web sites almost without writing any Python code. 653 654 It has a big, international community, the members of which have created many 655 web sites. There are also a lot of add-on projects which extend Django's normal 656 functionality. This is partly due to Django's well written `online 657 documentation <https://docs.djangoproject.com/>`_ and the `Django book 658 <http://www.djangobook.com/>`_. 659 660 661 .. note:: 662 663 Although Django is an MVC-style framework, it names the elements 664 differently, which is described in the `Django FAQ 665 <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>`_. 666 667 668 TurboGears 669 ^^^^^^^^^^ 670 671 Another popular web framework for Python is `TurboGears 672 <http://www.turbogears.org/>`_. TurboGears takes the approach of using already 673 existing components and combining them with glue code to create a seamless 674 experience. TurboGears gives the user flexibility in choosing components. For 675 example the ORM and template engine can be changed to use packages different 676 from those used by default. 677 678 The documentation can be found in the `TurboGears documentation 679 <https://turbogears.readthedocs.org/>`_, where links to screencasts can be found. 680 TurboGears has also an active user community which can respond to most related 681 questions. There is also a `TurboGears book <http://turbogears.org/1.0/docs/TGBooks.html>`_ 682 published, which is a good starting point. 683 684 The newest version of TurboGears, version 2.0, moves even further in direction 685 of WSGI support and a component-based architecture. TurboGears 2 is based on 686 the WSGI stack of another popular component-based web framework, `Pylons 687 <http://www.pylonsproject.org/>`_. 688 689 690 Zope 691 ^^^^ 692 693 The Zope framework is one of the "old original" frameworks. Its current 694 incarnation in Zope2 is a tightly integrated full-stack framework. One of its 695 most interesting feature is its tight integration with a powerful object 696 database called the `ZODB <https://launchpad.net/zodb>`_ (Zope Object Database). 697 Because of its highly integrated nature, Zope wound up in a somewhat isolated 698 ecosystem: code written for Zope wasn't very usable outside of Zope, and 699 vice-versa. To solve this problem the Zope 3 effort was started. Zope 3 700 re-engineers Zope as a set of more cleanly isolated components. This effort 701 was started before the advent of the WSGI standard, but there is WSGI support 702 for Zope 3 from the `Repoze <http://repoze.org/>`_ project. Zope components 703 have many years of production use behind them, and the Zope 3 project gives 704 access to these components to the wider Python community. There is even a 705 separate framework based on the Zope components: `Grok 706 <http://grok.zope.org/>`_. 707 708 Zope is also the infrastructure used by the `Plone <https://plone.org/>`_ content 709 management system, one of the most powerful and popular content management 710 systems available. 711 712 713 Other notable frameworks 714 ^^^^^^^^^^^^^^^^^^^^^^^^ 715 716 Of course these are not the only frameworks that are available. There are 717 many other frameworks worth mentioning. 718 719 Another framework that's already been mentioned is `Pylons`_. Pylons is much 720 like TurboGears, but with an even stronger emphasis on flexibility, which comes 721 at the cost of being more difficult to use. Nearly every component can be 722 exchanged, which makes it necessary to use the documentation of every single 723 component, of which there are many. Pylons builds upon `Paste 724 <http://pythonpaste.org/>`_, an extensive set of tools which are handy for WSGI. 725 726 And that's still not everything. The most up-to-date information can always be 727 found in the Python wiki. 728 729 .. seealso:: 730 731 The Python wiki contains an extensive list of `web frameworks 732 <https://wiki.python.org/moin/WebFrameworks>`_. 733 734 Most frameworks also have their own mailing lists and IRC channels, look out 735 for these on the projects' web sites. 736