Reputation: 1361
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
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
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
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
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