================================= How to use Django with mod_python ================================= Apache/mod_python currently is the preferred setup for using Django on a production server. mod_python, available at http://www.modpython.org/ , is similar to `mod_perl`_ : It embeds Python within Apache and loads Python code into memory when the server starts. Code stays in memory throughout the life of an Apache process, which leads to significant performance gains over other server arrangements. Basic configuration =================== To configure Django with mod_python, first make sure you have Apache installed, with the mod_python module activated. Then edit your ``httpd.conf`` file and add the following:: SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE myproject.settings.main PythonDebug On ...and replace ``myproject.settings.main`` with the path to your settings file, in dotted-package syntax. This tells Apache: "Use mod_python for any URL at or under '/mysite/', using the Django mod_python handler." It passes the value of ``DJANGO_SETTINGS_MODULE`` so mod_python knows which settings to use. Also, if you've manually altered your ``PYTHONPATH`` to put your Django project on it, you'll need to tell mod_python:: PythonPath "['/path/to/project'] + sys.path" You can also add directives such as ``PythonAutoReload Off`` for performance. See the `mod_python documentation`_ for a full list of options. Note that you should set ``PythonDebug Off`` on a production server. If you leave ``PythonDebug On``, your users would see ugly (and revealing) Python tracebacks if something goes wrong within mod_python. Restart Apache, and any request to /mysite/ or below will be served by Django. Note that Django's URLconfs won't trim the "/mysite/" -- they get passed the full URL. When deploying Django sites on mod_python, you'll need to restart Apache each time you make changes to your Python code. Here's a template for an admin configuration:: SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE myproject.settings.admin PythonDebug On The only thing different here is the ``DJANGO_SETTINGS_MODULE``. Multiple Django installations on the same Apache ================================================ It's entirely possible to run multiple Django installations on the same Apache instance. Just use ``VirtualHost`` for that, like so:: NameVirtualHost * ServerName www.example.com # ... SetEnv DJANGO_SETTINGS_MODULE myproject.settings.main ServerName admin.example.com # ... SetEnv DJANGO_SETTINGS_MODULE myproject.settings.admin If you need to put two Django installations within the same ``VirtualHost``, you'll need to take a special precaution to ensure mod_python's cache doesn't mess things up. Use the ``PythonInterpreter`` directive to give different ```` directives separate interpreters:: ServerName www.example.com # ... SetEnv DJANGO_SETTINGS_MODULE myproject.settings.main PythonInterpreter myproject_main SetEnv DJANGO_SETTINGS_MODULE myproject.settings.admin PythonInterpreter myproject_admin The values of ``PythonInterpreter`` don't really matter, as long as they're different between the two ``Location`` blocks. Running a development server with mod_python ============================================ If you use mod_python for your development server, you can avoid the hassle of having to restart the server each time you make code changes. Just set ``MaxRequestsPerChild 1`` in your ``httpd.conf`` file to force Apache to reload everything for each request. But don't do that on a production server, or we'll revoke your Django privileges. .. _mod_perl: http://perl.apache.org/ .. _mod_python documentation: http://modpython.org/live/current/doc-html/directives.html Serving media files =================== Django doesn't serve media files itself. It'd be inefficient to flow media files through a (relatively) complex framework when much, much more well-tuned solutions are better. We recommend using a separate Web server for serving media. Here are some good choices: * lighttpd_ * TUX_ * A stripped-down version of Apache_ If, however, you have no option but to serve media files on the same Apache ``VirtualHost`` as Django, here's how you can turn off mod_python for a particular part of the site:: SetHandler None Just change ``Location`` to the root URL of your media files. .. _lighttpd: http://www.lighttpd.net/ .. _TUX: http://en.wikipedia.org/wiki/TUX_web_server .. _Apache: http://httpd.apache.org/