简体   繁体   English

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

[英]How do I stop getting ImportError: Could not import settings 'mofin.settings' when using django with wsgi?

I can't get wsgi to import my settings file for my project 'mofin'. 我无法让wsgi为我的项目'mofin'导入我的设置文件。

The list of errors from the apache error log are as follows 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

I got the "hello world!" 我得到了“你好世界!” wsgi app listed here( http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide ) to work fine. 这里列出的wsgi应用程序( http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide )工作正常。

The settings.py file loads fine with python manage.py (runserver|shell|syncdb|test store) as does the application. 使用python manage.py(runserver | shell | syncdb | test store)可以很好地加载settings.py文件。

Here is my wsgi file: 这是我的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()

the sys.path as printed in the error log is 错误日志中打印的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'] ['/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-dadload','/ usr / lib / python2.5 / site-package','/ usr / lib / python2.5 / site -packages / gtk-2.0 ','/ home / django / mofin / trunk','/ home / django / mofin / trunk / mofin']

if I open an interactive shell with manage.py, sys.path is 如果我用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/site-packages/gtk-2.0'] ['/ 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-package','/ usr / LIB /的python2.5 /站点包/ GTK-2.0' ]

My django settings file looks like this: # Django settings for mofin project. 我的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'
)

This can also happen if you have an application (subdirectory to the project with an init file in it) named the same thing as the project. 如果您有一个与项目名称相同的应用程序(项目的子目录,其中包含一个init文件),也会发生这种情况。 Your settings.py file may be in your project folder, but it seems that a part of the django system looks first for a module inside the project by the same name as the project and when it can't find a settings.py in there, it fails with a misleading message. 您的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

Just something else to check for anyone else having this problem. 还有别的东西可以检查其他有这个问题的人。 Applies to Django 1.3 and probably others. 适用于Django 1.3和其他人。

I had a similar permissions problem, and although my settings.py had the right permissions, the .pyc's did not!!! 我有一个类似的权限问题,虽然我的settings.py具有正确的权限,但.pyc没有! So watch out for this. 所以要注意这一点。

Hey, just adding an additional answer to this problem. 嘿,只是为这个问题添加了一个额外的答案。 I had the exact same issue, but it wasn't file permissions. 我有完全相同的问题,但它不是文件权限。 I was appending "path/to/project", but not also appending "path/to". 我附加了“path / to / project”,但没有附加“path / to”。 Linked is mod_wsgi's Django integration explanation that showed me the answer. 链接是mod_wsgi的Django集成解释 ,向我展示了答案。

I found the answer... file permissions. 我找到了答案......文件权限。 /home/django was set to 700. ie only django can view the contents. / home / django设置为700.即只有django可以查看内容。 apache runs as Apache and so can't get past /home/django. apache作为Apache运行,因此无法通过/ home / django。

I think you need to have a trailing forward slash on that its what I have to do in my wsgi script in apache before I load up 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()

In my case 就我而言

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

Another cause of this problem is that you can't name your application the same as another python module. 此问题的另一个原因是您不能将您的应用程序命名为另一个python模块。 For example I called mine site , little realising that site is already a python module. 例如,我打电话给我的site ,很少意识到该site已经是一个python模块。

You can check this by starting python, and running import site , help(site) , and it will show you it isn't using your module. 你可以通过启动python,运行import sitehelp(site)来检查这一点,它会告诉你它没有使用你的模块。 This of course gives you errors when django tries to import site.settings which doesn't exist. 这当然会在django尝试导入不存在的site.settings时给出错误。

Possible problem: 可能的问题:

you forgot the __init__.py file, which must be in your project and in all directories which you consider a python module for import. 你忘记了__init__.py文件,它必须在你的项目和你认为用于导入的python模块的所有目录中。

Other thing you could try is to add the path directly into the manage.py file, like : 您可以尝试的其他方法是将路径直接添加到manage.py文件中,例如:

import sys

...
...

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

I hope it helps 我希望它有所帮助

I had the same problem but another solution : 我有同样的问题,但另一种解决方案:

My project folder was named exactly as one of my application. 我的项目文件夹完全被命名为我的应用程序之一。

I had : 我有:

/home/myApp /家/对myApp
/home/myApp/settings.py /home/myApp/settings.py
/home/myApp/manage.py /home/myApp/manage.py
/home/myApp/rights.py /home/myApp/rights.py
/home/myApp/static/ /家庭/对myApp /静态/
/home/myApp/static/ /家庭/对myApp /静态/
/home/myApp/ myApp /model.py / home / myApp / myApp /model.py
/home/myApp/ myApp /admin.py / home / myApp / myApp /admin.py
/home/myApp/ myApp /views.py / home / myApp / myApp /views.py

This kind of tree doesn't seems to be possible easily. 这种树似乎不太容易。 I changed the name of my project root folder and the problem was solved! 我更改了项目根文件夹的名称,问题解决了!

In my case, I had a circular import that was causing this error. 在我的情况下,我有一个导致此错误的循环导入 From settings.py I was importing one function in another module, and from that module I was importing a settings variable. settings.py我在另一个模块中导入一个函数,并从该模块导入一个设置变量。 To fix it, instead of directly importing from settings, I did this: 要修复它,而不是直接从设置导入,我这样做:

from django.conf import settings

Let me add and my experience for that issue. 让我补充一下这个问题的经验。 After head banging for few hours and try all from the above answers I found that few lines in settings.py file cause the problem: 在敲了几个小时并从上面的答案中尝试了所有后,我发现settings.py文件中的几行导致了问题:

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

After that I made copy of the settings.py, named scripts_settings.py whithout that lines, and used that file and everything is ok now. 之后我制作了settings.py的副本,命名为scripts_settings.py,然后使用该文件,现在一切正常。

(I wrote up this same answer for Django deployment problem in Apache/mod_wsgi. ImportError: Could not import settings 'site.settings' in case someone only finds this question.) (我在Apache / mod_wsgi中Django部署问题写了同样的答案.ImportError:如果有人只发现这个问题,就无法导入设置'site.settings' 。)

This doesn't appear to be the problem in your case, but I ran smack into the same ImportError when I used the WSGIPythonPath directive (instead of the .wsgi file) to set up sys.path . 在您的情况下,这似乎不是问题,但是当我使用WSGIPythonPath指令(而不是.wsgi文件)来设置sys.path时,我运行了相同的ImportError。 That worked fine until I switched to running WSGI in daemon mode. 这工作正常,直到我切换到以守护进程模式运行WSGI。 Once you do that, you have to use the python-path argument to the WSGIDaemonProcess directive instead. 一旦你这样做,你必须使用WSGIDaemonProcess指令的python-path参数。

At first look I'd say the python path is wrong but compared to interactive shell it looks ok. 初看起来我会说python路径是错误的,但与交互式shell相比它看起来还不错。 So maybe try this: 所以也许试试这个:

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

setup_environ(settings)

I was going to say that you can just insert/append your project directory to your sys.path in your wsgi file but if your settings file is at 我打算说你可以在你的wsgi文件中插入/追加你的项目目录到sys.path,但如果你的设置文件是

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

Then you should be good there. 那你应该在那里好。

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

That pretty much sums up what you are looking for. 这几乎总结了你在寻找什么。

Interesting that the error propagates though: 有趣的是错误传播:

for middleware_path in settings.MIDDLEWARE_CLASSES:

but you have what appears to be the exact default . 但你有看似确切的默认值

You might want to check which python interpreter is pointed to by wsgi. 您可能想要检查wsgi指向哪个python解释器。 Are you intending to use a virtualenv but wsgi is looking at your system install? 你打算使用virtualenv但是wsgi正在考虑你的系统安装吗?

You can also set the user and group that wsgi is running under. 您还可以设置运行wsgi的用户和组。 I use something like: 我使用类似的东西:

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

I had a similar problem, solved it with the following snippet in my python: 我有一个类似的问题,在我的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

Source: http://code.google.com/p/modwsgi/wiki/VirtualEnvironments#Application_Environments 来源: http//code.google.com/p/modwsgi/wiki/VirtualEnvironments#Application_Environments

我刚刚遇到此错误,解决方案是通过myvenv / source / activate启用我的虚拟环境。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM