views:

49

answers:

4

I'm trying to get Django and Apache working together using Mod_wsgi and currently I'm getting the following errors:

[Thu Jul 15 12:52:38 2010] [error] [client 10.100.50.73] mod_wsgi (pid=4803): Target WSGI script '/home/webdev/websites/virtualenvs/polaris/polaris_project.py' cannot be loaded as Python module.
[Thu Jul 15 12:52:38 2010] [error] [client 10.100.50.73] mod_wsgi (pid=4803): Exception occurred processing WSGI script '/home/webdev/websites/virtualenvs/polaris/polaris_project.py'.
[Thu Jul 15 12:52:38 2010] [error] [client 10.100.50.73] Traceback (most recent call last):
[Thu Jul 15 12:52:38 2010] [error] [client 10.100.50.73]   File "/home/webdev/websites/virtualenvs/polaris/polaris_project.py", line 8, in <module>
[Thu Jul 15 12:52:38 2010] [error] [client 10.100.50.73]     import django.core.handlers.wsgi
[Thu Jul 15 12:52:38 2010] [error] [client 10.100.50.73] ImportError: No module named django.core.handlers.wsgi

My apache conf looks like

Alias /polaris_django/media/ "/home/webdev/websites/virtualenvs/polaris/polaris/static/"
WSGIScriptAlias /polaris_django /home/webdev/websites/virtualenvs/polaris/polaris_project.py
WSGIApplicationGroup %{GLOBAL}

<Directory "/home/webdev/websites/virtualenvs/polaris">
        Order deny,allow
        Allow from all
</Directory>

My Mod_WSGi file looks like

import os, sys

sys.path.append('/home/webdev/websites/virtualenvs/polaris')
sys.path.append('/home/webdev/websites/virtualenvs/polaris/polaris/apps')
sys.path.append('/home/webdev/websites/virtualenvs/polaris/polaris/extra_settings')
os.environ['DJANGO_SETTINGS_MODULE'] = 'polaris.settings'
print >> sys.stderr, sys.path
import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()

How can I get apache serving Django properly?

+1  A: 

It looks like Django is not in your path... can you post the value of your sys.path?

Matthew J Morrison
[... '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/dist-packages', '/usr/lib/pymodules/python2.6', '/usr/lib/pymodules/python2.6/gtk-2.0', '/usr/local/lib/python2.6/dist-packages', '/home/webdev/websites/virtualenvs/polaris/pysrc/apps', '/home/webdev/websites/virtualenvs/polaris/pysrc/extra_settings', '/home/webdev/websites/virtualenvs/polaris/pysrc']
silent1mezzo
Also, if I do python polaris.wsgi it works fine. I've also changed up polaris -> pysrc
silent1mezzo
A: 

I'm guessing that apache is using either a different version of python or is using a different sys.path. What do you get as output for the sys.path?

godswearhats
+3  A: 

It looks like you're using a virtualenv - you need to activate that within your WSGI script to set up the paths correctly.

activate_this = os.path.join("path/to/my/virtualenv", "bin/activate_this.py")
execfile(activate_this, dict(__file__=activate_this))
Daniel Roseman
A: 

Where is Django installed? From command line Python do:

import django
print django.__file__

If it isn't installed in appropriate directory on sys.path under /usr/lib/python2.6 or /usr/local/lib/python2.6, then that is the problem.

Presuming you actually installed Django, this may occur because you have multiple installed Python versions and you used different one to what mod_wsgi is using to install Django. Or you used a virtual environment and haven't told mod_wsgi where that is. Or you managed to install Django with permissions that Apache cannot read.

Go watch the video of talk and read through slides referenced at:

http://blog.dscpl.com.au/2010/06/sydney-pycon-modwsgi-talk-slides.html

They cover this sort of issue as well as a lot of other stuff related to permissions etc.

Graham Dumpleton