Unos
Unos

Reputation: 1361

ImportError in Django site with mod_wsgi in Daemon mode

I am experimenting on running two wsgi applications configured on the same VirtualHost. One of the apps myapp is the standard hello-world code specified here. It is loading absolutely fine. The other app, uiapp is a Django site. It fails with an ImportError.

I read in wsgi docs that value of python-path is appended to the sys.path, so that's what I have specified in my WSGIDaemonProcess for uiapp.

I can't figure out if the problem is with the Python code, or the Apache configuration.

This is my virtualhost configuration:

    [ . . . ]

    # processGroups
    WSGIProcessGroup uiapp
    WSGIProcessGroup myapp

    # configurations for django sites
    WSGIScriptAlias /uiapp "/some/path/ui_dir/site_prod/wsgi.py"
    WSGIScriptAlias /myapp "/some/other/path/myapp.wsgi"

    # daemons
    WSGIDaemonProcess uiapp processes=2 threads=25 display-name=site_prod_wsgi python-path=/some/path/ui_dir
    WSGIDaemonProcess myapp processes=2 threads=25 display-name=helloworld_wsgi

    # doc root for /uiapp
    <Directory "/some/path/ui_dir/site_prod">
        Order allow,deny
        Allow from all
    </Directory>

    # doc root for /myapp
    <Directory "/some/other/path">
        Order allow,deny
        Allow from all
    </Directory>

    [ . . . ]

I have tried to change the python-path for uiapp to /some/path/ui_dir/site_prod, but even that is failing with the same error.

The error-log is:

 mod_wsgi (pid=32652): Exception occurred processing WSGI script '/some/path/ui_dir/site_prod/wsgi.py'.
 Traceback (most recent call last):
   File "/home/usr/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 219, in __call__
     self.load_middleware()
   File "/home/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 39, in load_middleware
     for middleware_path in settings.MIDDLEWARE_CLASSES:
   File "/home/usr/local/lib/python2.7/site-packages/django/utils/functional.py", line 184, in inner
     self._setup()
   File "/home/usr/local/lib/python2.7/site-packages/django/conf/__init__.py", line 42, in _setup
     self._wrapped = Settings(settings_module)
   File "/home/usr/local/lib/python2.7/site-packages/django/conf/__init__.py", line 95, in __init__
     raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
 ImportError: Could not import settings 'site_prod.settings' (Is it on sys.path?): No module named site_prod.settings

This is the source for /some/path/ui_dir/site_prod/wsgi.py

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "site_prod.settings")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

# Apply WSGI middleware here.
# from helloworld.wsgi import HelloWorldApplication
# application = HelloWorldApplication(application)

Kindly help me figure out what I am doing wrong.

Upvotes: 2

Views: 1398

Answers (4)

Graham Dumpleton
Graham Dumpleton

Reputation: 58523

You can't have two WSGIProcessGroup directives in a row like that. Only the last will be used. Thus you are actually sending both applications to the same daemon process group instead of different ones. Having done that and having them in the same process you are hitting the setdefault() issue described in:

Move the WSGIProcessGroup directives inside of the Directory blocks pertaining to the respective WSGI script file locations.

Upvotes: 5

Rickard Zachrisson
Rickard Zachrisson

Reputation: 985

Try this:

vhost:

<Virtualhost project.dev>
    DocumentRoot "/full/path/to/project/root/"

    WSGIScriptAlias / /full/path/to/wsgi/file/wsgi.py
</Virtualhost>

wsgi.py:

sys.path = ['path/to/project/root'] + sys.path

Upvotes: 0

Adam Spence
Adam Spence

Reputation: 3240

...and make sure you have set DJANGO_SETTINGS_MODULE in wsgi.py

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings.could.be.somewhere.else'

Upvotes: 0

Marwan Alsabbagh
Marwan Alsabbagh

Reputation: 26788

if you check out the previous version of the django docs version 1.3 instead of 1.4 the section How to use Django with Apache and mod_wsgi can be help solve your problem. I faced the same issue you are facing when I configured the virtualhosts. So instead of specifying python-path=/some/path/ui_dir in your virtualhost configuration. You can do it in /some/path/ui_dir/site_prod/wsgi.py add the lines below to that file. Place these lines before the lines at the top of the file before the stuff importing and running django.

code

import sys
path = '/some/path/ui_dir'
if path not in sys.path:
    sys.path.append(path)

Upvotes: 1

Related Questions