I can’t get wsgi to import my settings file for my project ‘mofin’.
The list of errors from the apache error log are as follows
mod_wsgi (pid=4001): Exception occurred within WSGI script '/var/www/wsgi-scripts/django.wsgi'. Traceback (most recent call last): File "/usr/lib/python2.5/site-packages/django/core/handlers/wsgi.py", line 228, in __call__ self.load_middleware() File "/usr/lib/python2.5/site-packages/django/core/handlers/base.py", line 31, in load_middleware for middleware_path in settings.MIDDLEWARE_CLASSES: File "/usr/lib/python2.5/site-packages/django/conf/__init__.py", line 28, in __getattr__ self._import_settings() File "/usr/lib/python2.5/site-packages/django/conf/__init__.py", line 59, in _import_settings self._target = Settings(settings_module) File "/usr/lib/python2.5/site-packages/django/conf/__init__.py", line 94, in __init__ raise ImportError, "Could not import settings '%s' (Is it on sys.path? Does it have syntax errors?): %s" % (self.SETTINGS_MODULE, e) ImportError: Could not import settings 'mofin.settings' (Is it on sys.path? Does it have syntax errors?): No module named mofin.settings
I got the “hello world!” wsgi app listed here(http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide) to work fine.
The settings.py file loads fine with python manage.py (runserver|shell|syncdb|test store)
as does the application.
Here is my wsgi file:
import os import sys sys.path.append('/home/django/mofin/trunk') sys.path.append('/home/django/mofin/trunk/mofin') print >> sys.stderr, sys.path os.environ['DJANGO_SETTINGS_MODULE'] = 'mofin.settings' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler()
the sys.path as printed in the error log is
[‘/usr/lib/python25.zip’, ‘/usr/lib/python2.5’, ‘/usr/lib/python2.5/plat-linux2’, ‘/usr/lib/python2.5/lib-tk’, ‘/usr/lib/python2.5/lib-dynload’, ‘/usr/lib/python2.5/site-packages’, ‘/usr/lib/python2.5/site-packages/gtk-2.0’, ‘/home/django/mofin/trunk’, ‘/home/django/mofin/trunk/mofin’]
if I open an interactive shell with manage.py, sys.path is
[‘/home/django/mofin/trunk/mofin’, ‘/usr/lib/python25.zip’, ‘/usr/lib/python2.5’, ‘/usr/lib/python2.5/plat-linux2’, ‘/usr/lib/python2.5/lib-tk’, ‘/usr/lib/python2.5/lib-dynload’, ‘/usr/lib/python2.5/site-packages’, ‘/usr/lib/python2.5/site-packages/gtk-2.0’]
My django settings file looks like this:
# Django settings for mofin project.
This can also happen if you have an application (subdirectory to the project with an init file in it) named the same thing as the project. Your settings.py file may be in your project folder, but it seems that a part of the django system looks first for a module inside the project by the same name as the project and when it can’t find a settings.py in there, it fails with a misleading message.
-uniquename1 ---settings.py ---manage.py ---application1 -----file.py -----file2.py ---uniquename1 (problem, rename this to some other unique name) -----file.py -----file2.py
Just something else to check for anyone else having this problem. Applies to Django 1.3 and probably others.
I had a similar permissions problem, and although my settings.py had the right permissions, the .pyc’s did not!!! So watch out for this.
Hey, just adding an additional answer to this problem. I had the exact same issue, but it wasn’t file permissions. I was appending “path/to/project”, but not also appending “path/to”. Linked is mod_wsgi’s Django integration explanation that showed me the answer.
I found the answer… file permissions. /home/django was set to 700. i.e. only django can view the contents. apache runs as Apache and so can’t get past /home/django.
I think you need to have a trailing forward slash on that its what I have to do in my wsgi script in apache before I load up django.
import os import sys sys.path.append('/home/django/mofin/trunk/') sys.path.append('/home/django/mofin/trunk/mofin/') print >> sys.stderr, sys.path os.environ['DJANGO_SETTINGS_MODULE'] = 'mofin.settings' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler()
In my case
import os import sys if os.uname() == 'vivien': sys.path.append('/home/www/sitebuilder.blacknight.ie/web/') os.environ['DJANGO_SETTINGS_MODULE'] = 'gibo.dev_settings' elif os.uname() == 'thingy': sys.path.append('/home/www/sitebuilder.blacknight.ie/web/') os.environ['DJANGO_SETTINGS_MODULE'] = 'gibo.dev_settings' else: sys.path.append('/home/www/sitebuilder.blacknight.ie/web/') os.environ['DJANGO_SETTINGS_MODULE'] = 'gibo.settings' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler()
Another cause of this problem is that you can’t name your application the same as another python module. For example I called mine
site, little realising that
site is already a python module.
You can check this by starting python, and running
help(site), and it will show you it isn’t using your module. This of course gives you errors when django tries to import
site.settings which doesn’t exist.
you forgot the __init__.py file, which must be in your project and in all directories which you consider a python module for import.
Other thing you could try is to add the path directly into the manage.py file, like :
import sys ... ... sys.path.insert(0, '/home/django/mofin/trunk')
I hope it helps
I had the same problem but another solution :
My project folder was named exactly as one of my application.
I had :
This kind of tree doesn’t seems to be possible easily.
I changed the name of my project root folder and the problem was solved!