如何停止获取ImportError:与wsgi一起使用django时无法导入设置“mofin.settings”?

我不能让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 )能正常工作。

使用python manage.py(runserver | shell | syncdb | test store),settings.py文件可以像应用程序一样正常加载。

这是我的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打开交互式shell,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 /站点包/ GTK-2.0' ]

我的django设置文件如下所示:#mofin项目的#Django设置。

 DEBUG = True TEMPLATE_DEBUG = DEBUG ADMINS = ( # ('Dan xxxx', 'xxxx@yyyyyyyyyy.com'), ) 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' ) 

如果你有一个应用程序(带有init文件的项目的子目录)和项目命名相同,也会发生这种情况。 您的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,可能还有其他的。

我有一个类似的权限问题,虽然我的settings.py有正确的权限,.pyc没有! 所以小心这个

嘿,只是为这个问题添加一个额外的答案。 我有完全相同的问题,但它不是文件权限。 我正在追加“path/到/项目”,但不追加“path/到”。 链接是mod_wsgi的Django集成解释 ,给我答案。

我find了答案…文件权限。 / home / django被设置为700.即只有django可以查看内容。 apache运行Apache,所以不能通过/ home / django。

我想你需要有一个尾随的正斜杠,在我加载django之前,我必须在我的apache的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() 

在我的情况

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

这个问题的另一个原因是,你不能命名你的应用程序相同的另一个python模块。 例如,我打电话给我的site ,很less意识到该site已经是一个Python模块。

你可以通过启动python来检查,并运行import site help(site) ,它会告诉你它没有使用你的模块。 当Django尝试导入不存在的site.settings时,这当然会给你带来错误。

可能的问题:

你忘了__init__.py文件,它必须在你的项目和所有你认为是用于导入的python模块的目录中。

其他的事情你可以尝试的是直接添加到manage.py文件的path,如:

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

我希望它有帮助

我有同样的问题,但另一个解决scheme:

我的项目文件夹被完全命名为我的应用程序之一。

我有:

/家/对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

这种树似乎并不容易。 我改变了我的项目根文件夹的名称,问题解决了!

(我在Apache / mod_wsgi中为Django部署问题写了同样的答案。ImportError:如果有人只发现这个问题, 不能导入设置的site.settings )。

这似乎不是你的情况的问题,但是当我使用WSGIPythonPath指令(而不是.wsgi文件)来设置sys.path时,我碰到了同样的ImportError。 这工作得很好,直到我切换到守护进程模式下运行WSGI。 一旦你这样做了,你必须使用WSGIDaemonProcess指令的python-path参数来代替。

在我的情况下,我有一个导致这个错误的循环导入 。 从settings.py我导入一个function在另一个模块,并从该模块我导入设置variables。 要解决它,而不是直接从设置导入,我做到了这一点:

 from django.conf import settings 

让我补充一下我的经验。 头撞了几个小时后,尝试所有从上面的答案我发现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没有这些行,并使用该文件,现在一切正常。

首先看,我会说pythonpath是错误的,但与交互式shell相比,它看起来不错。 所以也许试试这个:

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

我想说,你可以插入/追加你的项目目录到你的wsgi文件的sys.path,但如果你的设置文件在

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

那你应该在那里好。

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

这几乎总结了你在找什么。

有趣的是,错误传播虽然:

 for middleware_path in settings.MIDDLEWARE_CLASSES: 

但你有什么似乎是确切的默认 。

您可能想要检查wsgi指向的是哪个python解释器。 你打算使用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

添加两行代码

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

我有一个类似的问题,解决了它在我的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

我只是有这个错误,解决scheme是通过myvenv / source / activate启用我的虚拟环境。