32

I've deployed Django to Apache via mod_wsgi. Django is running fine when hosted from Apache. However, I'm trying to do some maintenance via manage.py, but when I try and run it, I get the error:

Error: Could not import settings 'myproject.settings' (Is it on sys.path?): No module named settings

user@localhost:~$ cd /usr/local/myproject
user@localhost:/usr/local/myproject$ ls
drwxr-xr-x 2 apache apache   4096 2011-09-07 19:38 apache
-rw-r--r-- 1 apache apache      0 2011-05-25 14:52 __init__.py
-rw-r--r-- 1 apache apache    813 2011-09-09 16:56 manage.py
drwxr-xr-x 6 apache apache   4096 2011-09-09 16:43 myapp
-rw-r--r-- 1 apache apache   4992 2011-09-07 19:31 settings.py
drwxr-xr-x 4 apache apache   4096 2011-09-08 20:32 templates
-rw-r--r-- 1 apache apache   1210 2011-09-08 14:49 urls.py

Django seems to be ignoring the DJANGO_SETTINGS_MODULE environment variable.

user@localhost:~$ cd /usr/local/myproject
user@localhost:/usr/local/myproject$ export DJANGO_SETTINGS_MODULE=settings
user@localhost:/usr/local/myproject$ python manage.py shell
Error: Could not import settings 'myproject.settings' (Is it on sys.path?): No module named settings
user@localhost:/usr/local/myproject$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import settings
>>> 

Just to confirm I wasn't going crazy, I commented out everything inside manage.py except the import settings line, and it ran correctly.

I've also tried setting os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' and sys.path.append('/usr/local/myproject') directly at the top of manage.py, to no avail.

What's going on here? Why is Django using the wrong settings module name? This is driving me crazy.

the
  • 21,007
  • 11
  • 68
  • 101
Cerin
  • 60,957
  • 96
  • 316
  • 522

14 Answers14

42

This can happen if your root directory name is the same as the name of one of your apps. For example here I have a directory called bar containing a Django project with an app also called bar:

Simons-MacBook-Pro ~/temp
$ cd bar

Simons-MacBook-Pro ~/temp/bar
$ ./manage.py shell
Error: Could not import settings 'bar.settings' (Is it on sys.path?): No module named settings

Simons-MacBook-Pro ~/temp/bar
$ ls -l
total 48
-rw-r--r--  1 simon  staff     0 25 Oct 10:46 __init__.py
-rw-r--r--  1 simon  staff   130 25 Oct 10:46 __init__.pyc
drwxr-xr-x  7 simon  staff   238 25 Oct 10:46 bar
-rwxr-xr-x  1 simon  staff   503 25 Oct 10:46 manage.py
-rw-r--r--  1 simon  staff  5025 25 Oct 10:46 settings.py
-rw-r--r--  1 simon  staff  2658 25 Oct 10:46 settings.pyc
-rw-r--r--  1 simon  staff   556 25 Oct 10:46 urls.py

Changing the root directory's name to foo (or anything else other than bar) solves the problem:

Simons-MacBook-Pro ~/temp/bar
$ cd ..

Simons-MacBook-Pro ~/temp
$ mv bar foo

Simons-MacBook-Pro ~/temp
$ cd foo

Simons-MacBook-Pro ~/temp/foo
$ ./manage.py shell
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 
Simon Whitaker
  • 20,506
  • 4
  • 62
  • 79
17

I had a similar problem, where the same error was being returned when I tried to run django-admin.py startproject myapp. A previous answer here helped me figure it out. The problem was that I had previously pointed DJANGO_SETTINGS_MODULE to a certain file, which I had later deleted. To fix it, I just removed the pointer with this command:

export DJANGO_SETTINGS_MODULE=

Community
  • 1
  • 1
Paul Meinshausen
  • 779
  • 1
  • 8
  • 13
9

It seems the path to your project isn't being recognized by wsgi. This has happened to me, and to solve it I added this to the top of my .wsgi file:

import os
import sys

root_path = os.path.abspath(os.path.split(__file__)[0])
sys.path.insert(0, os.path.join(root_path, 'project_name'))
sys.path.insert(0, root_path)
David542
  • 104,438
  • 178
  • 489
  • 842
  • Actually he told that it is been recognized "I've deploy Django to Apache via mod_wsgi. Django is running fine when hosted from Apache." – Arthur Neves Sep 09 '11 at 21:47
  • Correct, my wsgi is fine. It's my manage.py that's broken. Oddly enough, I fixed it using a similar method to what you posted. – Cerin Sep 11 '11 at 08:15
  • It seems to me that what you do in WSGI should be mirrored in manage.py, that is the PATH environment variable should be the same. I think this may avoid confusion when serving django with apache, and serving it with ./manage.py runserver, shell etc. – MagicLAMP Aug 12 '15 at 02:44
6

Somehow, if your project folder is the same name as the app that has the settings file in it, and if you have __init__.py in the project root folder, it will mess wsgi. I really dont understand why but removing this file solved this for me.

Martin Massera
  • 1,718
  • 1
  • 21
  • 47
  • I think it is because Django gets confused if you have two nested folders, with the same name, one of which is the app folder, both of which contain __init__.py. Does Django interpret that as two nested apps and look for settings in the upper folder? – GrahamJ May 06 '19 at 21:26
  • This is crazy! Thank you so much! Does anyone understand why this happens ? – Hritik Oct 30 '21 at 17:24
5

Though Simon Whitaker's answer (that a same-name dir is confusing things) is certainly on point, rather than suggesting you change your entire extant dir structure, might I suggest:

Instead of using the "malfunctioning" / ambiguous...

import settings

...use the more specific...

from django.conf import settings
Jan Kyu Peblik
  • 1,435
  • 14
  • 20
4

If you are using wsgi/uwsgi in production...

I was having the same error:

If you renamed the folder that django startproject created that has setting.py files and wsgi.py , check in the wsgi.py file the line: os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<your_folder_name>.settings")

In my case i had to rename < your_folder_name> also.

Renato Prado
  • 3,770
  • 4
  • 21
  • 26
3

I had accidentally changed my DJANGO_SETTINGS_MODULE variable using the echo command: echo DJANGO_SETTINGS_MODULE=mysite.settings

I simply quit virtualenv and activated it again, which restored my settings.

wcyn
  • 3,826
  • 2
  • 31
  • 25
2

I had DJANGO_SETTINGS_MODULE set to "mealer.settings"

(django-env)ali@a-N750JV:~/snap/projects-on-django/Rester$ export -p | grep DJANGO

declare -x DJANGO_SETTINGS_MODULE="mealer.settings"

which I removed by

ali@ali-N750JV:~/snap/projects-on-django/Rester$ export -n  DJANGO_SETTINGS_MODULE

(django-env)ali@ali-N750JV:~/snap/projects-on-django/Rester$ export -p | grep DJAN

(django-env)ali@ali-N750JV:

export -p | grep DJAN found nothing as you see

this answer is based on answer by Paul Meinshausen

2

my answer might not match the question exactly, but I have to point out.

one reason might be, the directory lack the __init__.py file!

This is my environment files:

[root@hpc-proxy apigateway]# ls -al gateway/gateway/settings/
total 52
drwxr-xr-x 2 root root  228 Feb 19 18:19 .
drwxr-xr-x 3 root root  177 Feb 19 19:00 ..
-rw-r--r-- 1 root root 7738 Feb 19 17:52 base.py
-rw-r--r-- 1 root root 6722 Feb 19 18:19 base.pyc
-rw-r--r-- 1 root root 2539 Feb 19 15:02 shanghai07.py
-rw-r--r-- 1 root root  950 Feb  5 12:45 shanghai07root.py
-rw-r--r-- 1 root root 2828 Feb  5 13:00 testenv.py

and I always get the error message like this: ImportError: No module named shanghai07

So when I created the __init__.py file in the 'settings' directory, the error went away!

I hope my answer can help some beginners.

Striezel
  • 3,693
  • 7
  • 23
  • 37
teddy wang
  • 21
  • 2
  • If settings/__init__.py exists, you may have an old settings/__init__.pyc that you may get rid off: `find . -name '*.pyc' -delete` – nicolallias Jan 24 '22 at 12:52
1

Since your web app is working, check that you're running manage.py with the same python interpreter that's defined in your .wsgi file (and if you append other directories to sys.path in your .wsgi file, make sure they're in the pythonpath here too).

If you try to import something in your settings file that throws an ImportError, Django tells you settings cannot be imported. Newer versions of django will mention (If the file settings.py does indeed exist, it's causing an ImportError somehow.) and I've run into this a few times.

If it's not that, maybe try using django-admin.py instead, just in case something has gone wrong in your manage.py file. AFAIK there is no good reason to modify manage.py directly.

danny
  • 10,103
  • 10
  • 50
  • 57
0

Please check for compatibility between the virtualenv version and the django version. when it matches, it works like a gem.

user6041236
  • 35
  • 1
  • 6
0

In my case the wsgi.py file was working when the system was running normally, but I was getting the ImportError when trying to do a manual manage.py command like migrate or collectstatic.

I checked wsgi.py for the way it imports the settings and noticed that it first adds the settings path to the sys.path as follows:

import sys
sys.path.append('/opt/server/settings')

I added that to the top of the manage.py and it works.

James Bradbury
  • 1,708
  • 1
  • 19
  • 31
0

For me it was actually the PATH, so the project wasn't inside the path, I did this:

export PYTHONPATH=/var/www/project:$PYTHONPATH

If it's a local project it might be something like this:

export PYTHONPATH=~/my-project:$PYTHONPATH

Questions? comment and I'll answer.

elad silver
  • 9,222
  • 4
  • 43
  • 67
0

I tried all the suggestions in the answers above without joy. My error was the startup command line:

python manage.py runserver --settings=settings 192.168.1.183:8006

When I added the directory where the settings file was located, joy...

python manage.py runserver --settings=<settings_file_dir>.settings 192.168.1.183:8006

The DJANGO_SETTINGS_MODULE variable made no difference

MIkee
  • 904
  • 8
  • 12