As a powerful scripting language adapted to both fast prototyping and bigger projects, Python is widely used in Web applications development.
The Web Server Gateway Interface (or “WSGI” for short) is a standard interface between web servers and Python web application frameworks. By standardizing behavior and communication between web servers and Python web frameworks, WSGI makes it possible to write portable Python web code that can be deployed in any WSGI-compliant web server. WSGI is documented in PEP-3333.
Broadly speaking, a web framework consist of a set of libraries and a main handler within which you can build custom code to implement a web application (i.e. an interactive web site). Most web frameworks include patterns and utilities to accomplish at least the following:
Django is a “batteries included” web application framework. By providing many utilities and patterns out of the box, Django aims to make it possible to build complex, database-backed web applications quickly, while encouraging best practices in code written using it.
Django has a large and active community, and many pre-built re-usable modules that can be incorporated into a new project as-is, or customized to fit your needs.
Flask is a “microframework” for Python. Rather than aiming to provide everything you could possibly need, Flask implements the most commonly-used core components of a web application framework, like URL routing, request and response objects, and templates. As a user of Flask, it is therefore up to you to choose and integrate other components you may need, such as database access or form generation and validation. For many popular modules, Extensions may already exist to suit your needs.
Support for flask can best be found in its mailing list. Just shoot an email to firstname.lastname@example.org and reply to the confirmation email.
Werkzeug is not actually a real framework, but rather a very powerful set of tools for building web applications. It provides URL routing utilities, request and response objects and a basic development server. It is mostly used where users need bigger flexibility for their application that is not commonly found in other web frameworks.
Support can be found on its mailing list.
Pyramid lies somewhere between a big framework like Django and the microframeworks: It comes with a lot of libraries and functionality and can thus not be considered lightweight. On the other hand, it does not provide all the functionality Django does. Instead Pyramid brings basic support for most regular tasks and provides a great deal of extensibility. Additionally, Pyramid has a huge focus on complete documentation. As a little extra it comes with the Werkzeug Debugger which allows you to debug a running web application in the browser.
Support can also be found in the documentation.
Nginx (pronounced “engine-x”) is a web server and reverse-proxy for HTTP, SMTP and other protocols. It is known for its high performance, relative simplicity, and compatibility with many application servers (like WSGI servers). It also includes handy features like load-balancing, basic authentication, streaming, and others. Designed to serve high-load websites, Nginx is gradually becoming quite popular.
Stand-alone WSGI servers typically use less resources than traditional web servers and provide top performance .
Gunicorn (Green Unicorn) is a WSGI server used to serve Python applications. It is a Python interpretation of the Ruby Unicorn server. Unicorn is designed to be lightweight, easy to use, and uses many UNIX idioms. Gunicorn is not designed to face the internet – it was designed to run behind Nginx which buffers slow requests and takes care of other important considerations. A sample setup for Nginx + Gunicorn can be found in the Gunicorn help.
The WSGI servers serve the Python applications while the web server handles tasks better suited for it such as static file serving, request routing, DDoS protection, and basic authentication.
Platform-as-a-Service (PaaS) is a type of cloud computing infrastructure which abstracts and manages infrastructure, routing, and scaling of web applications. When using PaaS, application developers can focus on writing application code rather than needing to be concerned with deployment details.
Most PaaS services offer a command-line interface that developers can use to set up and interrogate configuration, and to deploy new releases of an application to the service.
PaaS services and their partners offer add-on functionality which is well integrated into the platform, such as database hosting, email services, logging, scheduled and background tasks, billing and payment, etc.
Heroku allows you to run as many Python web applications as you like, 24/7 and free of charge. Heroku is best described as a horizontal scaling platform. They start to charge you once you “scale” your application to run on more than one Dyno (abstracted servers) at a time.
DotCloud supports WSGI applications and background/worker tasks natively on their platform. Web applications run Python version 2.6, use nginx and uWSGI, and allow custom configuration of both for advanced users.
DotCloud uses a custom command-line API client which can work with applications managed in git repositories or any other version control system.
DotCloud has a free plan with limited database size, and without extra services (caching…).
See the DotCloud documentation on Python for more information and help getting started.
Gondor is a PaaS specialized for deploying Django and Pinax applications. Gondor supports Django versions 1.2 and 1.3 on Python version 2.7, and can automatically configure your Django site if you use local_settings.py for site-specific configuration information.
Most WSGI applications are responding to HTTP requests to serve content in HTML or other markup languages. Instead of generating directly textual content from Python, the concept of separation of concerns advises us to use templates. A template engine manages a suite of template files, with a system of hierarchy and inclusion to avoid unnecessary repetition, and is in charge of rendering (generating) the actual content, filling the static content of the templates with the dynamic content generated by the application.
As template files are sometimes written by designers or front-end developers, it can be difficult to handle increasing complexity.
Some general good practices apply to the part of the application passing dynamic content to the template engine, and to the templates themselves.
|||The mod_python project is now officially dead|
|||mod_wsgi vs mod_python|
|||Benchmark of Python WSGI Servers|