Как мне перестать получать ImportError: Не удалось импортировать настройки 'mofin.settings' при использовании django с wsgi?

60

Я не могу заставить wsgi импортировать мой файл настроек для моего проекта "mofin".

Список ошибок из журнала ошибок apache выглядит следующим образом

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

Я получил "привет мир!". wsgi, перечисленное здесь (http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide), чтобы работать нормально.

Файл settings.py загружается с помощью python manage.py(runningerver | shell | syncdb | test store) как и приложение.

Вот мой файл wsgi:

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()

sys.path, напечатанный в журнале ошибок,

['/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 ']

если я открываю интерактивную оболочку с помощью manage.py, sys.path имеет

['/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' ]

Мой файл настроек django выглядит так:   # Настройки Django для проекта mofin.

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'
)
Теги:
wsgi

16 ответов

48

Это также может произойти, если у вас есть приложение (подкаталог проекта с файлом инициализации в нем), называемое тем же, что и проект. Файл settings.py может находиться в папке проекта, но кажется, что часть системы django сначала ищет модуль внутри проекта с тем же именем, что и проект, и когда он не может найти параметр settings.py, он выходит из строя с вводящим в заблуждение сообщением.

-uniquename1

---settings.py

---manage.py

---application1

-----file.py

-----file2.py

---uniquename1  (problem, rename this to some other unique name)

-----file.py

-----file2.py

Просто что-то еще, чтобы проверить, есть ли у кого-нибудь еще эта проблема. Применяется к Django 1.3 и, возможно, другим.

  • 4
    Есть ли другое решение, чем переименование директорий?
  • 0
    Я не искал решений в то время, но если это все еще происходит, я думаю, что это не та проблема, которую разработчики отдали приоритет. Раскрыть причину этого не в моих силах. Я уверен, что именно в базовой системе изменения должны быть сделаны.
Показать ещё 1 комментарий
22

У меня была аналогичная проблема с разрешениями, и хотя мои settings.py имели правильные разрешения,.pyc не делал!!! Поэтому следите за этим.

  • 6
    +1 просто была похожа на проблему с OP, и удаление * .pyc решило ее, так что спасибо. похоже, это хорошо работает alias rmpyc="find . -name "*.pyc" -exec rm -rf {} \;" «очистить» проект
  • 0
    +1 Случилось со мной, когда я восстановил свой Mac, спасибо!
Показать ещё 1 комментарий
18

Эй, просто добавив дополнительный ответ на эту проблему. У меня была такая же проблема, но это были не разрешения для файлов. Я добавлял "путь/в/проект", но не добавлял "путь/к". Связано это mod_wsgi объяснение интеграции Django, которое показало мне ответ.

  • 4
    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) Перед любыми другими ру заявления. Решил проблему. Спасибо за подсказку :-)
8

Я нашел ответ... права доступа к файлам. /home/django было установлено значение 700. Т.е. только django может просматривать содержимое. Apache работает как Apache и поэтому не может пройти мимо/home/django.

  • 8
    Какое самое безопасное разрешение дать этому каталогу, который позволит Apache читать его?
7

Я думаю, что вам нужно иметь косые черты косой черты, что я должен сделать в своем wsgi script в apache, прежде чем загружать 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()

В моем случае

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()
  • 0
    Это была моя проблема. Добавление второго оператора добавления исправило это! Спасибо за помощь!
  • 0
    кто-то должен проголосовать за этот ответ! косая черта необходима, когда вы добавляете в PYTHONPATH. смешной! это потратило час моего времени.
6

Другой причиной этой проблемы является то, что вы не можете назвать свое приложение таким же, как и другим модулем python. Например, я назвал my site, мало понимая, что site уже является модулем python.

Вы можете проверить это, запустив python и запустив import site, help(site), и он покажет вам, что он не использует ваш модуль. Это, конечно, дает вам ошибки, когда django пытается импортировать site.settings, который не существует.

4

Возможная проблема:

вы забыли файл __init__.py, который должен быть в вашем проекте и во всех каталогах, которые вы считаете модулем python для импорта.

Другая вещь, которую вы могли бы попробовать, - добавить путь непосредственно в файл manage.py, например:

import sys

...
...

sys.path.insert(0, '/home/django/mofin/trunk')

Я надеюсь, что это поможет

  • 0
    Благодаря Xidobix, я нашел другой модуль без файла инициализации .py, исправление, которое исправило сайт администратора на runserver, но это все еще не работает. Добавление путей напрямую не исправило это. Я думаю, я создам очень простой проект и постараюсь заставить его работать и двигаться дальше.
  • 0
    Я упростил его еще больше, создал новый проект с "django-admin.py startproject peanut", изменил файл wsgi так, чтобы он указывал на "peanut.settings", вместо этого peanut отлично работает с runserver, но та же ошибка с wsgi. Может ли это быть что-то, связанное с правами доступа к файлам, владением файлами или некоторыми другими переменными окружения, которые отличаются между runserver и wsgi?
Показать ещё 2 комментария
3

У меня была та же проблема, но другое решение:

Моя папка проекта была названа в точности как одно из моих приложений.

У меня было:

/дом/MYAPP
/home/myApp/settings.py
/home/myApp/manage.py
/home/myApp/rights.py
/Главная/MYAPP/статический/
/Главная/MYAPP/статический/
/home/myApp/ myApp/model.py
/home/myApp/ myApp/admin.py
/home/myApp/ myApp/views.py

Такое дерево не кажется возможным легко. Я изменил имя корневой папки проекта и проблема была решена!

  • 1
    Я считаю, что это теперь возможно (1.4), так как я не вижу этой проблемы. code.djangoproject.com/ticket/1908
  • 1
    эта проблема возникает, только если у вас есть файл init .py в корневой папке проекта, поскольку он ошибочно полагает, что импортер думает, что это модуль, который можно импортировать (вместо того, чтобы смотреть на модуль с тем же именем внутри него)
1

Позвольте мне добавить и мой опыт в этом вопросе. После того, как голова ударила несколько часов и попробовала все из приведенных выше ответов, я обнаружил, что несколько строк в файле settings.py вызывают проблему:

from south.modelsinspector import add_introspection_rules
add_introspection_rules([], ["^dynamicsites.fields.FolderNameField"])
add_introspection_rules([], ["^dynamicsites.fields.SubdomainListField"])

После этого я сделал копию settings.py с именем scripts_settings.py без этих строк и использовал этот файл, и теперь все в порядке.

1

В моем случае у меня был циклический импорт, который вызывал эту ошибку. Из settings.py я импортировал одну функцию в другой модуль, и из этого модуля я импортировал переменную настроек. Чтобы исправить это, вместо прямого импорта из настроек я сделал следующее:

from django.conf import settings
1

(я написал этот же ответ для проблемы с развертыванием Django в Apache/mod_wsgi. ImportError: не удалось импортировать настройки 'site.settings', если кто-то только найдет это вопрос.)

Это не проблема в вашем случае, но я столкнулся с тем же ImportError, когда я использовал директиву WSGIPythonPath (вместо файла .wsgi), чтобы настроить sys.path. Это работало нормально, пока я не переключился на запуск WSGI в режиме демона. Как только вы это сделаете, вы должны использовать аргумент python-path для директивы WSGIDaemonProcess.

0

У меня просто была эта ошибка, и решение заключалось в том, чтобы включить мою виртуальную среду через myvenv/source/activate.

0

У меня была аналогичная проблема, она была решена с помощью следующего фрагмента в моем python:

ALLDIRS = ['/var/www/MarkerDB/']

import sys 
import site 

# Remember original sys.path.
prev_sys_path = list(sys.path) 

# Add each new site-packages directory.
for directory in ALLDIRS:
  site.addsitedir(directory)

# Reorder sys.path so new directories at the front.
new_sys_path = [] 
for item in list(sys.path): 
    if item not in prev_sys_path: 
        new_sys_path.append(item) 
        sys.path.remove(item) 
sys.path[:0] = new_sys_pat

Источник: http://code.google.com/p/modwsgi/wiki/VirtualEnvironments#Application_Environments

0

Добавьте еще две строки кода

sys.path.append('/home/django/mofin/mofin')
sys.path.append('/home/django/mofin/trunk/mofin/mofin')

в файл wsgi по строке:

sys.path.append('/home/django/mofin/trunk/mofin/')
0

Я собирался сказать, что вы можете просто вставить/добавить каталог проекта в свой sys.path в свой файл wsgi, но если ваш файл настроек находится в

/home/django/mofin/trunk/mofin/settings.py

Тогда вам должно быть хорошо.

Is it on sys.path? Does it have syntax errors?

Это в значительной степени подводит итог тому, что вы ищете.

Интересно, что ошибка распространяется, хотя:

for middleware_path in settings.MIDDLEWARE_CLASSES:

но у вас есть то, что кажется точный по умолчанию.

Возможно, вам захочется проверить, на какой интерпретатор python указана wsgi. Вы собираетесь использовать virtualenv, но wsgi смотрит на вашу систему установки?

Вы также можете установить пользователя и группу, с которой работает wsgi. Я использую что-то вроде:

WSGIDaemonProcess mysite.com user = skyl group = skyl processes = n threads = N python-path =/home/skyl/pinax/pinax-env2/lib/python2.6/site-packages

0

Сначала я бы сказал, что путь python неверен, но по сравнению с интерактивной оболочкой он выглядит нормально. Поэтому, возможно, попробуйте следующее:

from django.core.management import setup_environ
from mofin import settings

setup_environ(settings)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню