web-dev-qa-db-ja.com

ImportErrorの取得を停止するにはどうすればよいですか?Django= with wsgi

プロジェクト 'mofin'の設定ファイルを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

「hello world!」ここにリストされているwsgiアプリ( http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide )は正常に動作します。

Settings.pyファイルは、アプリケーションと同様にpython manage.py(runserver | 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 ']

My 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'
)
63
Dan

これは、プロジェクトと同じ名前のアプリケーション(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およびおそらく他のものに適用されます。

48
shanemgrey

同様の権限の問題があり、settings.pyには適切な権限がありましたが、.pycにはありませんでした!!!だから、これに気をつけろ。

22
adeleinr

ちょっと、この問題に答えを追加するだけです。私はまったく同じ問題を抱えていましたが、ファイルのアクセス許可ではありませんでした。 「path/to/project」を追加していましたが、「path/to」も追加していませんでした。リンクされているのはmod_wsgiの Django統合の説明 です。

18
Seaux

答えを見つけました...ファイルのアクセス許可。/home/Djangoは700に設定されました。つまり、Djangoのみがコンテンツを表示できます。ApacheはApacheとして実行されるため、/ home/Djangoを超えることはできません。

8
Dan

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

この問題の別の原因は、アプリケーションに別のpythonモジュールと同じ名前を付けることができないことです。たとえば、私はsiteと呼びますが、siteはすでにpythonモジュールです。

これを確認するには、Pythonを起動し、_import site_、help(site)を実行します。モジュールを使用していないことがわかります。もちろん、これはDjango=が存在しない_site.settings_をインポートしようとするとエラーになります。

6
Timmmm

考えられる問題:

__init__.pyファイルを忘れました。このファイルは、プロジェクトと、インポート用のpythonモジュールと見なされるすべてのディレクトリに存在する必要があります。

他に試すことができるのは、次のように、manage.pyファイルにパスを直接追加することです。

import sys

...
...

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

私はそれが役立つことを願っています

4
Xidobix

私は同じ問題を抱えていましたが、別の解決策がありました:

プロジェクトフォルダの名前は、アプリケーションの名前とまったく同じです。

私が持っていた:

/ home/myApp
/home/myApp/settings.py
/home/myApp/manage.py
/home/myApp/rights.py
/home/myApp/static /
/home/myApp/static /
/home/myApp/myApp/model.py
/home/myApp/myApp/admin.py
/home/myApp/myApp/views.py

この種の木は、簡単には実現できないようです。プロジェクトのルートフォルダーの名前を変更すると、問題は解決しました。

3

その問題に対する私の経験を追加してみましょう。数時間頭を叩いて上記の答えをすべて試してみたところ、settings.pyファイルの数行が問題の原因であることがわかりました。

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

その後、その行を使わずにscripts_settings.pyという名前のsettings.pyのコピーを作成し、そのファイルを使用しましたが、今はすべて大丈夫です。

1
kpacn

私の場合、このエラーの原因となった循環インポートがありました。 settings.pyから別のモジュールの関数をインポートし、そのモジュールから設定変数をインポートしていました。それを修正するには、設定から直接インポートする代わりに、これを行いました:

from Django.conf import settings
1
Caumons

Apache/mod_wsgiのDjangoデプロイメントの問題。ImportError: 'site.settings'の設定をインポートできませんでした 誰かがこの質問を見つけた場合にのみ)について同じ答えを書きました。)

これは問題ではないように見えますが、WSGIPythonPathディレクティブ(.wsgiファイルの代わりに)を使用してsys.pathをセットアップしたときに、同じImportErrorに遭遇しました。デーモンモードでWSGIを実行するように切り替えるまで、それはうまくいきました。それを行ったら、代わりにWSGIDaemonProcessディレクティブのpython-path引数を使用する必要があります。

1
yukondude

私はあなたのプロジェクトディレクトリを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:

しかし、 exact default のように見えるものがあります。

どの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
Skylar Saveland

最初は、pythonパスは間違っていますが、インタラクティブなシェルと比較すると問題ないように見えます。

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

setup_environ(settings)
0
Botond Béres

このエラーが発生したばかりで、解決策はmyvenv/source/activateを介して仮想環境を有効にすることでした。

0
Casey

さらに2行のコードを追加します

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
LouisYe

私は同様の問題を抱えていましたが、私の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
Bas