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.
When you use Django, you have to tell it which settings you're using. Do this by using an environment variable, DJANGO_SETTINGS_MODULE . The value of DJANGO_SETTINGS_MODULE should be in Python path syntax, e.g. mysite. settings .
Insights about settings.py file. A Django settings file contains all the configuration of your Django Project. In this article the important points of settings.py file of Django will be discussed. A settings file is just a Python module with module-level variables.
In your python settings file, you have to import our LazySetting class located in python_settings. Only the first time you call this property, the HeavyInitializationClass will be instantiated and the *args and **kwargs parameters will be passed. Every time you call this property the same instance will be returned.
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) >>>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With