it-swarm.com.de

Wie bekomme ich keine ImportError mehr: Konnte die Einstellungen 'mofin.settings' nicht importieren, wenn Django mit wsgi verwendet wird?

Ich kann wsgi nicht dazu bringen, meine Einstellungsdatei für mein Projekt 'mofin' zu importieren.

Die Liste der Fehler aus dem Apache-Fehlerprotokoll lautet wie folgt

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

Ich habe die "Hallo Welt!" Die hier aufgelistete wsgi-App ( http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide ) funktioniert einwandfrei. 

Die Datei "settings.py" wird mit python manage.py (runserver | Shell | syncdb | test store) Ebenso wie die Anwendung geladen.

Hier ist meine wsgi-Datei:

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

der im Fehlerprotokoll angegebene sys.path ist

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

wenn ich eine interaktive Shell mit manage.py öffne, ist sys.path das

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

Meine Django-Einstellungsdatei sieht folgendermaßen aus: # Django-Einstellungen für das Mofin-Projekt.

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

Dies kann auch passieren, wenn Sie eine Anwendung (Unterverzeichnis des Projekts mit einer Init-Datei) haben, die dasselbe wie das Projekt benannt hat. Die Datei settings.py befindet sich möglicherweise in Ihrem Projektordner, aber es scheint, dass ein Teil des Django-Systems zuerst nach einem Modul innerhalb des Projekts sucht, das denselben Namen hat wie das Projekt und wenn es dort keine settings.py finden kann schlägt es mit einer irreführenden Nachricht fehl.

-uniquename1

---settings.py

---manage.py

---application1

-----file.py

-----file2.py

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

-----file.py

-----file2.py

Nur etwas anderes für alle anderen, die dieses Problem haben. Gilt für Django 1.3 und wahrscheinlich auch für andere.

48
shanemgrey

Ich hatte ein ähnliches Berechtigungsproblem, und obwohl meine Einstellungen.py die richtigen Berechtigungen hatte, haben die .pyc's nicht !!! Also aufpassen.

22
adeleinr

Hey, füge einfach eine zusätzliche Antwort auf dieses Problem hinzu. Ich hatte genau das gleiche Problem, aber es waren keine Dateiberechtigungen. Ich habe "path/to/project" angehängt, aber nicht auch "path/to". Verbunden ist die Erklärung von mod_wsgi Django-Integration , die mir die Antwort zeigte.

18
Seaux

Ich habe die Antwort gefunden ... Dateiberechtigungen./home/Django wurde auf 700 eingestellt. Das heißt, nur Django kann den Inhalt anzeigen. Apache läuft als Apache und kann daher nicht an/home/Django vorbeigehen. 

8
Dan

Ich denke, du musst einen schleppenden Schrägstrich haben, was ich in meinem wsgi-Skript in Apache tun muss, bevor ich Django lade.

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 meinem Fall

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

Eine weitere Ursache für dieses Problem ist, dass Sie Ihre Anwendung nicht wie ein anderes Python-Modul benennen können. Zum Beispiel habe ich meine site angerufen, wobei ich wenig begriff, dass site bereits ein Python-Modul ist.

Sie können dies überprüfen, indem Sie python starten und import site, help(site) ausführen. Es zeigt Ihnen, dass Ihr Modul nicht verwendet wird. Dies gibt natürlich Fehler, wenn Django versucht, site.settings zu importieren, der nicht existiert.

6
Timmmm

Mögliches Problem:

sie haben die Datei __init__.py vergessen, die sich in Ihrem Projekt und in allen Verzeichnissen befinden muss, die Sie als Import-Python-Modul betrachten.

Sie können auch versuchen, den Pfad direkt in die Datei manage.py einzufügen, z.

import sys

...
...

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

Ich hoffe, es hilft

4
Xidobix

Ich hatte das gleiche Problem, aber eine andere Lösung:

Mein Projektordner wurde genau wie meine Anwendung benannt.

Ich hatte :

/ home/myApp
/home/myApp/settings.py
/home/myApp/manage.py
/home/myApp/rights.py
/home/meineApp/statisch /
/home/meineApp/statisch /
/home/myApp / myApp / model.py
/home/myApp / myApp / admin.py
/home/myApp / myApp / views.py

Diese Art von Baum scheint nicht leicht möglich zu sein ... Ich habe den Namen meines Projektstammordners geändert und das Problem wurde gelöst!

3

Lassen Sie mich und meine Erfahrung für dieses Thema hinzufügen. Nachdem ich einige Stunden lang mit dem Kopf geschlagen und alle Antworten aus den obigen Antworten versucht hatte, stellte ich fest, dass einige Zeilen in der Datei settings.py das Problem verursachen:

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

Danach habe ich eine Kopie der Datei settings.py mit dem Namen scripts_settings.py ohne diese Zeilen erstellt und diese Datei verwendet. Jetzt ist alles in Ordnung.

1
kpacn

In meinem Fall hatte ich einen zirkulären Import , der diesen Fehler verursachte. Von settings.py importierte ich eine Funktion in einem anderen Modul und von diesem Modul aus importierte ich eine Einstellungsvariable. Um das Problem zu beheben, habe ich Folgendes getan, anstatt direkt aus den Einstellungen zu importieren:

from Django.conf import settings
1
Caumons

(Ich habe dieselbe Antwort für Django Deployment-Problem in Apache/mod_wsgi geschrieben. ImportError: Konnte die Einstellungen 'site.settings' nicht importieren, falls jemand diese Frage nur findet.)

Dies scheint nicht das Problem in Ihrem Fall zu sein, aber ich habe den gleichen ImportError verwendet, als ich die Anweisung WSGIPythonPath (anstelle der .wsgi-Datei) zum Einrichten von sys.path verwendet habe. Das hat gut funktioniert, bis ich WSGI im Daemon-Modus ausgeführt habe. Wenn Sie das getan haben, müssen Sie stattdessen das Argument python-path für die Anweisung WSGIDaemonProcess verwenden.

1
yukondude

Ich wollte sagen, dass Sie Ihr Projektverzeichnis einfach an Ihre sys.path in Ihrer Wsgi-Datei anfügen können, wenn sich Ihre Einstellungsdatei jedoch in diesem Ordner befindet

/home/Django/mofin/trunk/mofin/settings.py

Dann solltest du gut sein.

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

Das fasst ziemlich genau zusammen, wonach Sie suchen.

Interessant, dass sich der Fehler jedoch ausbreitet:

for middleware_path in settings.MIDDLEWARE_CLASSES:

aber Sie haben das, was scheinbar der exakte Standard ist.

Vielleicht möchten Sie überprüfen, auf welchen Python-Interpreter wsgi zeigt. Beabsichtigen Sie eine virtualenv zu verwenden, aber wsgi prüft Ihre Systeminstallation?

Sie können auch den Benutzer und die Gruppe festlegen, unter der wsgi ausgeführt wird. Ich benutze so etwas wie:

WSGIDaemonProcess mysite.com user = skyl Gruppe = Skyl-Prozesse = n Threads = N Python-Pfad =/home/skyl/pinax/pinax-env2/lib/python2.6/site-packages

0
Skylar Saveland

Auf den ersten Blick würde ich sagen, dass der Python-Pfad falsch ist, aber im Vergleich zu interaktiver Shell sieht er ok aus.

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

setup_environ(settings)
0
Botond Béres

Ich hatte gerade diesen Fehler und die Lösung bestand darin, meine virtuelle Umgebung über myvenv/source/enable zu aktivieren. 

0
Casey

Fügen Sie zwei weitere Codezeilen hinzu 

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

zu Ihrer Wsgi-Datei unter der Zeile:

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

Ich hatte ein ähnliches Problem und löste es mit dem folgenden Ausschnitt in meinem 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

Quelle: http://code.google.com/p/modwsgi/wiki/VirtualEnvironments#Application_Environments

0
Bas