How do I stop getting ImportError: Could not import settings 'mofin.settings' when using django with wsgi?

85,755

Solution 1

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.

Solution 2

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.

Solution 3

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.

Solution 4

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.

Solution 5

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()[1] == 'vivien':
    sys.path.append('/home/www/sitebuilder.blacknight.ie/web/')
    os.environ['DJANGO_SETTINGS_MODULE'] = 'gibo.dev_settings'
elif os.uname()[1] == '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()
Share:
85,755
Dan
Author by

Dan

Programming for twenty odd years in Algol68, BBC Basic, Pascal, Cobol, 370/Assembler, CLIST, Rexx, Fortran, C, C++, Perl, PHP and now Python. Started programming at school and in my bedroom, then for a department store, then for research and then for the BBC. Then I started telling other people how to program. Looking forward to learning Python. I feel like I've learnt Python now, well I know it better than any other language, obviously there's always more to learn.

Updated on July 08, 2022

Comments

  • Dan
    Dan almost 2 years

    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.

    DEBUG = True
    TEMPLATE_DEBUG = DEBUG
    
    ADMINS = (
        # ('Dan xxxx', '[email protected]'),
    )
    
    MANAGERS = ADMINS
    
    DATABASE_ENGINE = 'mysql'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
    DATABASE_NAME = 'mofin'             # Or path to database file if using sqlite3.
    DATABASE_USER = 'aaaaaa'             # Not used with sqlite3.
    DATABASE_PASSWORD = 'bbbbbb'         # Not used with sqlite3.
    DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
    DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.
    
    # Local time zone for this installation. Choices can be found here:
    # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
    # although not all choices may be available on all operating systems.
    # If running in a Windows environment this must be set to the same as your
    # system time zone.
    TIME_ZONE = 'Europe/London'
    
    # Language code for this installation. All choices can be found here:
    # http://www.i18nguy.com/unicode/language-identifiers.html
    LANGUAGE_CODE = 'en-GB'
    
    SITE_ID = 1
    
    # If you set this to False, Django will make some optimizations so as not
    # to load the internationalization machinery.
    USE_I18N = True
    
    # Absolute path to the directory that holds media.
    # Example: "/home/media/media.lawrence.com/"
    MEDIA_ROOT = '/home/django/media/'
    
    # URL that handles the media served from MEDIA_ROOT. Make sure to use a
    # trailing slash if there is a path component (optional in other cases).
    # Examples: "http://media.lawrence.com", "http://example.com/media/"
    MEDIA_URL = 'http://mofin.mywebsite.co.uk/media/'
    
    # URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
    # trailing slash.
    # Examples: "http://foo.com/media/", "/media/".
    ADMIN_MEDIA_PREFIX = '/admin_media/'
    
    # Make this unique, and don't share it with anybody.
    SECRET_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    
    # List of callables that know how to import templates from various sources.
    TEMPLATE_LOADERS = (
        'django.template.loaders.filesystem.load_template_source',
        'django.template.loaders.app_directories.load_template_source',
    #     'django.template.loaders.eggs.load_template_source',
    )
    
    MIDDLEWARE_CLASSES = (
        'django.middleware.common.CommonMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
    )
    
    ROOT_URLCONF = 'mofin.urls'
    
    TEMPLATE_DIRS = (
        # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
        # Always use forward slashes, even on Windows.
        # Don't forget to use absolute paths, not relative paths.
    )
    
    INSTALLED_APPS = (
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.sites',
        'django.contrib.admin',
        'mofin.store'
    )
    
  • Dan
    Dan over 14 years
    Thanks Xidobix, I did find another module without an init.py file, fixing that fixed the admin site on runserver, but this is still not working. Adding the paths directly didn't fix it either. I think I'll create an extremely simple project and try and get that to work and move on from there.
  • Dan
    Dan over 14 years
    I've simplified it even more, created a new project with "django-admin.py startproject peanut" modified the wsgi file to point to "peanut.settings" instead peanut works fine with runserver but same error with wsgi. Could it be something to do with file permissions, file ownership or some other environment variables that are different between runserver and wsgi?
  • Xidobix
    Xidobix over 14 years
    Dan, i sincerely have never used wsgi, i use mod_python. But at the end of the guide you are reading, is a link to code.google.com/p/modwsgi/wiki/IntegrationWithDjango. There must be the answer you are looking for. Good Luck!
  • Tony Adams
    Tony Adams over 12 years
    What is the safest permission to give that directory which will let Apache read it?
  • T I
    T I over 12 years
    +1 just had similar problem to OP and removing *.pyc resolved it so thanks. this seems to work nicely alias rmpyc="find . -name "*.pyc" -exec rm -rf {} \;" to 'clean' a project
  • Nathan Jones
    Nathan Jones over 12 years
    This was my problem. Adding the second append statement fixed it! Thanks for the help!
  • JWL
    JWL about 12 years
    import os, sys base = os.path.dirname(os.path.dirname(__file__)) base_parent = os.path.dirname(base) sys.path.append(base) sys.path.append(base_parent) Before any other py statements. Solved the problem. Thanks for the hint :-)
  • John Lehmann
    John Lehmann about 11 years
    I believe this is now possible (1.4) as I'm not seeing this problem. code.djangoproject.com/ticket/1908
  • Dexter Legaspi
    Dexter Legaspi about 11 years
    somebody should upvote this answer! the trailing slash is needed when you add to PYTHONPATH. ridiculous! it ate up an hour of my time.
  • Dmytriy Voloshyn
    Dmytriy Voloshyn about 10 years
    is there other solution then renaming dirs?
  • shanemgrey
    shanemgrey over 9 years
    I didn't look for solutions at the time, but if this is still happening, I'd guess it's not an issue the developers have prioritized yet. Digging into the reason for this is beyond my skills. I'm confident it's in the core system where the changes would have to be made.
  • Timo
    Timo about 9 years
    I do not think you are right Shaneveeg. In my case, the "settings.py" is in the "second level" of the project folder as seen here when doing "django-admin.py startproject mysite": docs.djangoproject.com/en/1.6/intro/tutorial01
  • tato
    tato about 8 years
    this problem occurs only if you have a init.py file in the project root folder, as it mistakes the importer into thinking that this is a module that can be imported (instead of looking at the module with the same name inside of it)
  • imran.ke
    imran.ke almost 2 years
    when using daemon mode, it keeps saying: PYTHONPATH = (not set) in error.logs even though I set together with python-home which is shown in the error.logs. Do you know why this keeps happening?