Django Shell Нет настроек модуля с именем
Я развернул Django в Apache через mod_wsgi
. Django отлично работает при размещении в Apache. Тем не менее, я пытаюсь выполнить некоторое обслуживание с помощью manage.py
, но когда я пытаюсь запустить его, я получаю сообщение об ошибке:
Ошибка: не удалось импортировать настройки "myproject.settings" (есть ли это на sys.path?): ни один модуль с настройками
[email protected]:~$ cd /usr/local/myproject
[email protected]:/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, похоже, игнорирует переменную среды DJANGO_SETTINGS_MODULE.
[email protected]:~$ cd /usr/local/myproject
[email protected]:/usr/local/myproject$ export DJANGO_SETTINGS_MODULE=settings
[email protected]:/usr/local/myproject$ python manage.py shell
Error: Could not import settings 'myproject.settings' (Is it on sys.path?): No module named settings
[email protected]:/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
>>>
Просто, чтобы подтвердить, что я не сходил с ума, я прокомментировал все внутри manage.py, кроме строки import settings
, и он работал правильно.
Я также попытался установить os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
и sys.path.append('/usr/local/myproject')
непосредственно в начало manage.py, безрезультатно.
Что здесь происходит? Почему Django использует неправильное имя модуля настроек? Это сводит меня с ума.
Ответы
Ответ 1
Это может произойти, если имя вашего корневого каталога совпадает с именем одного из ваших приложений. Например, здесь у меня есть каталог с именем bar
, содержащий проект Django с приложением, также называемым 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
Изменение имени корневого каталога на foo
(или что-либо еще, кроме bar
) решает проблему:
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)
>>>
Ответ 2
У меня была аналогичная проблема, когда та же ошибка возвращалась, когда я пытался запустить django-admin.py startproject myapp
.
A предыдущий ответ здесь помог мне понять это. Проблема заключалась в том, что я ранее указывал DJANGO_SETTINGS_MODULE
на определенный файл, который я позже удалил. Чтобы исправить это, я просто удалил указатель с помощью этой команды:
export DJANGO_SETTINGS_MODULE=
Ответ 3
Кажется, что путь к вашему проекту не распознается wsgi. Это случилось со мной, и для ее решения я добавил это в начало моего файла .wsgi:
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)
Ответ 4
Как бы то ни было, если ваша папка проекта совпадает с именем приложения, в котором есть файл настроек, и если у вас есть __init__.py
в корневой папке проекта, это испортит wsgi. Я действительно не понимаю, почему, но удаление этого файла решило это для меня.
Ответ 5
Если вы используете wsgi/uwsgi в процессе производства...
У меня была такая же ошибка:
Если вы переименовали папку, созданную django startproject с файлами settings.py и wsgi.py, проверьте в файле wsgi.py строку: os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<your_folder_name>.settings")
В моем случае мне пришлось переименовать < your_folder_name > .
Ответ 6
Хотя Саймон Уайтакер отвечает (что одноименный каталог путает вещи), безусловно, стоит на месте, вместо того, чтобы предлагать вам изменить всю существующую структуру, могу ли я предложить:
Вместо использования "неисправного" /неоднозначного...
import settings
... используйте более конкретные...
from django.conf import settings
Ответ 7
Поскольку ваше веб-приложение работает, убедитесь, что вы используете manage.py
с тем же интерпретатором python, который определен в вашем файле .wsgi(и если вы добавите другие каталоги в sys.path в ваш .wsgi файл, убедитесь, что они тоже находятся в pythonpath).
Если вы попытаетесь импортировать что-то в свой файл настроек, который вызывает ImportError, Django сообщает, что параметры не могут быть импортированы. В более новых версиях django указывается (If the file settings.py does indeed exist, it causing an ImportError somehow.)
, и я несколько раз сталкивался с этим.
Если это не так, попробуйте вместо этого использовать django-admin.py, на всякий случай что-то пошло не так в файле manage.py. AFAIK нет веских причин для изменения manage.py напрямую.
Ответ 8
Я случайно изменил свою переменную DJANGO_SETTINGS_MODULE
с помощью команды echo: echo DJANGO_SETTINGS_MODULE=mysite.settings
Я просто выхожу из virtualenv и снова активировал его, что восстановило мои настройки.
Ответ 9
Проверьте совместимость версии virtualenv и версии django. когда он соответствует, он работает как драгоценный камень.
Ответ 10
В моем случае файл wsgi.py работал, когда система работала нормально, но я получал ImportError, когда пытался выполнить ручную команду manage.py, такую как migrate или collectstatic.
Я проверил wsgi.py на предмет импорта настроек и заметил, что сначала он добавляет путь к настройкам в sys.path следующим образом:
import sys
sys.path.append('/opt/server/settings')
Я добавил это в начало файла manage.py, и оно работает.
Ответ 11
Мне присвоили DJANGO_SETTINGS_MODULE значение "mealer.settings"
(django-env)[email protected]:~/snap/projects-on-django/Rester$ export -p | grep DJANGO
declare -x DJANGO_SETTINGS_MODULE="mealer.settings"
который я удалил
[email protected]:~/snap/projects-on-django/Rester$ export -n DJANGO_SETTINGS_MODULE
(django-env)[email protected]:~/snap/projects-on-django/Rester$ export -p | grep DJAN
(django-env)[email protected]:
экспорт -p | grep DJAN ничего не нашел, как видите
этот ответ основан на ответе Пола Майнсхаузена