2009-09-11 2 views
63

Я не могу заставить wsgi импортировать мой файл настроек для моего проекта «mofin».Как прекратить получение ImportError: не удалось импортировать настройки «mofin.settings» при использовании django с wsgi?

Список ошибок из журнала ошибок 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 | тестового хранилища) , как и приложение.

Вот мой 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 для 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' 
) 
+2

проверить ответ от этого вопроса: http://stackoverflow.com/questions/4194243/django-wgsi-paths – radztech

ответ

4

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

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

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

import sys 

... 
... 

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

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

+0

Благодаря Xidobix, я нашел еще один модуль без __init__.py файла, фиксируя, что неподвижная администратор сайта на сервере, но это все еще не работает. Добавление путей напрямую не исправить. Я думаю, что создам чрезвычайно простой проект и попытаюсь заставить его работать и двигаться дальше. – Dan

+0

Я упростил его еще больше, создал новый проект с «django-admin.py startproject peanut» изменил файл wsgi, чтобы указать на «peanut.settings» вместо . Арахис отлично работает с сервером, но с той же ошибкой с wsgi. Может ли это быть чем-то связанным с разрешениями на файлы, владением файлами или некоторыми другими переменными среды, которые отличаются между серверами-серверами и wsgi? – Dan

+0

Дэн, я искренне никогда не использовал wsgi, я использую mod_python. Но в конце руководства, которое вы читаете, есть ссылка на http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango. Должен быть ответ, который вы ищете. Удачи! – Xidobix

0

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

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

setup_environ(settings) 
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: 

, но у вас есть то, что, как представляется, exact default.

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

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

WSGIDaemonProcess mysite.com пользователя = skyl группы = skyl процессы = N = N потоки питона-Path =/Home/skyl/pinax/pinax-ENV2/Lib/python2.6/сайт-пакетов

8

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

+7

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

21

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

+6

+1 у меня была аналогичная проблема с OP и удалением * .pyc разрешил это так спасибо. это похоже на работу «alias rmpyc =» find. -name «* .pyc» -exec rm -rf {} \; "' для очистки проекта –

+0

+1 Случилось, когда я восстановил свой Mac, thx! –

18

Эй, просто добавив дополнительный ответ на эту проблему. У меня была такая же проблема, но это были не разрешения для файлов. Я добавлял «путь/в/проект», но не добавлял «путь/к». Linked - это Django integration explanation от mod_wsgi, который показал мне ответ.

+4

'импорт ОС, SYS база = os.path.dirname (os.path.dirname (__ FILE__)) base_parent = os.path.dirname (основание) sys.path.append (основа) sys.path .append (base_parent) 'Перед любыми другими инструкциями py. Решила проблему. Спасибо за подсказку :-) – nemesisfixx

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 и, возможно, другим.

+3

есть ли другое решение, а затем переименовать dirs? –

+0

В то время я не искал решений, но если это все еще происходит, я бы предположил, что это не проблема, которую разработчики придают приоритетное значение. Копать в причину этого не зависит от моих навыков. Я уверен, что это в основной системе, где изменения должны быть сделаны. – shanemgrey

+0

Я не думаю, что ты прав Шаневега. В моем случае «settings.py» находится на «втором уровне» папки проекта, как показано здесь, когда вы делаете «django-admin.py startproject mysite»: https://docs.djangoproject.com/en/1.6/ intro/tutorial01/ – Timo

3

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

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

Я имел:

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

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

+1

Я считаю, что теперь это возможно (1.4), поскольку я не вижу этой проблемы. https://code.djangoproject.com/ticket/1908 –

+1

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

7

Я думаю, что вам нужно иметь косые косые черты на этом, что я должен сделать в своем сценарии wsgi в 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

Это была моя проблема. Добавив второй оператор append, он исправил это! Спасибо за помощь! –

+0

Кто-то должен возвысить этот ответ! ** при добавлении к PYTHONPATH требуется конечная косая черта **. смешной! он съел час моего времени. –

1

(я писал этот же ответ для Django deployment problem in Apache/mod_wsgi. ImportError: Could not import settings 'site.settings' в случае, если кто-то находит только этот вопрос.)

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

6

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

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

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/') 
1

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

from django.conf import settings 
0

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

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

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 Whithout что строки, и использовали этот файл, и все в порядке.

0

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

Смежные вопросы