Letting users put static files and php files in a public_html folder in their home directory has been a common convention for some time. I created a way for users to have a public_python folder that will allow for python projects.

In the apache configuration files I created some regular expression patterns that will look for a wsgi file based on the url requested. To serve this url: http://domain/~user/p/myproject, the server will look for this wsgi file: /home/user/public_python/myproject/deploy/myproject.wsgi

It is set up to run wsgi in daemon mode so that each user can touch their own wsgi file to restart their project instead of needing to reload the apache config and inconvenience everyone.

This is the code I added to the apache configuration (in a virtual host, other configs might be different):

RewriteEngine On RewriteCond % { REQUEST_URI } ^/~ ( \w+ ) /p/ ( \w+ ) / ( .* ) RewriteRule . - [ E=python_project_name:% 2 ] WSGIScriptAliasMatch ^/~ ( \w+ ) /p/ ( \w+ ) /home/$ 1 /public_python/$ 2 /deploy/$ 2 .wsgi WSGIDaemonProcess wsgi_processes.% { ENV:python_project_name } processes= 2 threads= 15 WSGIProcessGroup wsgi_processes.% { ENV:python_project_name } AliasMatch ^/~ ( \w+ ) /p/ ( \w+ ) / files ( .* ) /home/$ 1 /public_python/$ 2 / files $ 3 <LocationMatch ^/~ ( \w+ ) /p/ ( \w+ ) / files ( .* ) > SetHandler none </LocationMatch> AliasMatch ^/~ ( \w+ ) /p/ ( \w+ ) /media ( .* ) /home/$ 1 /public_python/$ 2 /media$ 3 <LocationMatch ^/~ ( \w+ ) /p/ ( \w+ ) /media ( .* ) > SetHandler none </LocationMatch>

This will also serve two directories statically for images, css, and javascript. For one of them, I always make a symbolic link to the django admin media and tell my settings file to use that.

ln -s / path / to / django / contrib / admin / media media

To use this for a django project

This is a sample wsgi file to use for a django project. Username and project_name will need to be replaced. I’m also adding an apps folder to the path following the style I mention in my reusable apps post.

import os import sys sys . path = [ '/home/username/public_python/' , '/home/username/public_python/project_name/apps' ] + sys . path from django. core . handlers . wsgi import WSGIHandler os . environ [ 'DJANGO_SETTINGS_MODULE' ] = 'project_name.settings' application = WSGIHandler ( )

I’ve been using this for a couple weeks and it’s working great for me. If you use it, I’d like to know how it works out for you. Let me know in the comments.

I use webfaction to host a lot of my django projects. It has an easy setup that will get you developing quickly and a great community of talented programmers. There is also a quick setup for rails, wordpress, and a lot more.

Related posts: