Python Projects in Users’ Home Directories with wsgi
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.
Related posts:
- How to Add Locations to Python Path for Reusable Django Apps In my previous post I talk about reusable apps, but…
- Getting Basecamp API Working with Python I found one library that was linked everywhere, but it…
- Setting up Apache2, mod_python, MySQL, and Django on Debian Lenny or Ubuntu Hardy Heron Both Debian and Ubuntu make it really simple to get…