django-wsgiserver 0.8.0 Beta

A web server for Django using CherryPy's WSGI server

  Add it to your Download Basket!

 Add it to your Watch List!


Rate it!

What's new in django-wsgiserver 0.8.0 Beta:

  • 0.8.0 target django 1.5+, python 2.6, 2.7, and 3.2+
  • add autoreload as default
  • serve static files correctly using django.contrib.staticfiles
Read full changelog
send us
an update
BSD License 
Peter Baumgartner and Chris Lee-Messer
ROOT \ Internet \ Django Plugins
django-wsgiserver is a Django plugin for serving Django sites via CherryPy's excellent, production ready, pure-python web server without needing to install all of Cherrypy. Note that Cherrypy names its server "wsgiserver" but it is actually a full-blown, multi-threaded http/https web server which has been used on production sites alone, or more often proxied behind a something like Apache or nginx.


The wsgiserver component has been used for years in production. Peter Baumgartner noted that it solved problems for him on memory on a memory-limited VPS hosted site [1]. Performance-wise it does well: it can serve up thousands of requests per second [Piel2010].

I haven't used django-wsgiserver for production myself (yet) as daemonized modwsgi and uwsgi have served me well. I use it all the time though during development. It's my "pocket-sized" server. completely written in python and it gives me an instant approximation of the final production environment I use. In some ways, it's much better than the development server which is built into django. It's noticeable when I have pages that do multiple ajax calls and the built-in runserver hangs. I just stop the built-in server, and then do runwsgiserver

and reload my browser page and the problem is fixed. It's also useful to see if some weird effect is being caused by runserver's process of loading the settings twice.

This project is a slight modification of code form Peter Baumgartner code (see Peter's blog post) Peter and others did the work of creating a management command. I've added a few small improvements from my point of view: It doesn't require installing cherrypy separately. It uses the same port as the development server (8000) so I don't need to re-enter my testing url in my browser, and it works by default with OS's like Mac OS 10.6 and Ubuntu 10.04 which prefer binding localhost to an ip6 address.


To get started using the server, you need nothing outside of django itself and the project code that you would like to serve up. However, for ssl support, you may need PyOpenSSL--though the new cherrypy server includes support for using the python built-in ssl module depending on which version of python you are using.


To install, django-wsgiserver follows the usual pattern for a django python application. You have several options

 1. pip install django-wsgiserver OR
 2. easy_install django-wsgiserver
 3. If you would like to use the latest possible version, you can use pip and mercurial checkout from bitbucket

pip install -e hg+

 4. Alternatively you can download the code and install it so that django_wsgiserver is on your PYTHONPATH

After you used one of the methods above, you need to add django_wsgiserver to your INSTALLED_APPS in your django project's settings file.


To see how to run the server as a management command, run:

python runwsgiserver help

from within your project directory. You'll see something like what's below:

Run this project in CherryPy's production quality http webserver.
Note that it's called wsgiserver but it is actually a complete http server.

 runwsgiserver [options] [wsgi settings] [stop]

 Optional CherryPy server settings: (setting=value)
 host=HOSTNAME hostname to listen on
 Defaults to,
 (set to to bind all ip4 interfaces or :: for
 all ip6 interfaces)
 port=PORTNUM port to listen on
 Defaults to 8000
 server_name=STRING CherryPy's SERVER_NAME environ entry
 Defaults to localhost
 daemonize=BOOL whether to detach from terminal
 Defaults to False
 pidfile=FILE write the spawned process-id to this file
 workdir=DIRECTORY change to this directory when daemonizing
 threads=NUMBER Number of threads for server to use
 ssl_certificate=FILE SSL certificate file
 ssl_private_key=FILE SSL private key file
 server_user=STRING user to run daemonized process
 Defaults to www-data
 server_group=STRING group to daemonized process
 Defaults to www-data

 Run a "standard" CherryPy server server
 $ runwsgiserver

 Run a CherryPy server on port 80
 $ runwsgiserver port=80

Run a CherryPy server as a daemon and write the spawned PID in a file
 $ runwsgiserver daemonize=true pidfile=/var/run/

 Run a CherryPy server using ssl with test certificates located in /tmp
 $ runwsgiserver ssl_certificate=/tmp/testserver.crt ssl_private_key=/tmp/testserver.key


If you want to use an installed version of Cherrypy--perhaps because you now have a more recent version, you only need to change one line of code in (around line 177) of django_wsgiserver/management/commands/

from django_wsgiserver.wsgiserver import CherryPyWSGIServer as Server
#from cherrypy.wsgiserver import CherryPyWSGIServer as Server

Just comment out the import from django_wsgiserver.wsgiserver and uncomment the import from cherrypy.wsgiserver to make the switch.

Last updated on August 23rd, 2011


#WSGI server #web server #Django #CherryPy #WSGI #server

Add your review!