web-dev-qa-db-fra.com

Comment cesser d'obtenir ImportError: Impossible d'importer les paramètres "mofin.settings" lors de l'utilisation de Django avec wsgi?

Je ne parviens pas à importer le fichier de paramètres de wsgi pour mon projet 'mofin'.

La liste des erreurs du journal des erreurs Apache est la suivante

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

J'ai eu le "bonjour le monde!" L'application wsgi répertoriée ici ( http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide ) fonctionne correctement. 

Le fichier settings.py se charge bien avec python manage.py (serveur d'exécution | Shell | syncdb | magasin de tests) De même que l'application.

Voici mon fichier 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()

le sys.path tel qu’il est imprimé dans le journal des erreurs est

['/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/coffre ','/home/Django/mofin/coffre/mofin ']

si j'ouvre un shell interactif avec manage.py, sys.path est

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

Mon fichier de paramètres Django ressemble à ceci: # Paramètres Django pour le projet 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

Cela peut également arriver si vous avez une application (sous-répertoire du projet contenant un fichier init) portant le même nom que le projet. Votre fichier settings.py se trouve peut-être dans le dossier de votre projet, mais il semble qu'une partie du système Django recherche d'abord un module dans le projet portant le même nom que le projet et lorsqu'il ne trouve pas de fichier settings.py dans celui-ci. , il échoue avec un message trompeur.

-uniquename1

---settings.py

---manage.py

---application1

-----file.py

-----file2.py

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

-----file.py

-----file2.py

Juste quelque chose d'autre à vérifier pour quiconque ayant ce problème. S'applique à Django 1.3 et probablement à d'autres.

48
shanemgrey

J'ai eu un problème d'autorisations similaire, et bien que mon settings.py avait les bonnes autorisations, le .pyc n'en avait pas !!! Alors faites attention à cela.

22
adeleinr

Hey, ajoutons juste une réponse supplémentaire à ce problème. J'ai eu exactement le même problème, mais ce n'était pas les autorisations de fichiers. J'ajoutais "chemin/à/projet", mais pas aussi "chemin/à". Lié est lié à l'explication d'intégration de Django qui m'a montré la réponse.

18
Seaux

J'ai trouvé la réponse ... les autorisations de fichiers./home/Django a été défini sur 700. Seul Django peut voir le contenu. Apache fonctionne sous Apache et ne peut donc pas passer/home/Django. 

8
Dan

Je pense que vous devez avoir une barre oblique de fin, c'est ce que je dois faire dans mon script wsgi dans Apache avant de charger 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()

Dans mon cas

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

Une autre cause de ce problème est que vous ne pouvez pas nommer votre application de la même manière qu’un autre module Python. Par exemple, j'ai appelé le mien site, réalisant peu que site est déjà un module python.

Vous pouvez vérifier cela en démarrant python et en exécutant import site, help(site), et il vous montrera qu'il n'utilise pas votre module. Cela vous donne bien sûr des erreurs lorsque Django essaie d'importer site.settings qui n'existe pas.

6
Timmmm

Problème possible:

vous avez oublié le fichier __init__.py, qui doit figurer dans votre projet et dans tous les répertoires que vous considérez comme un module python à importer.

Vous pouvez également essayer d’ajouter le chemin directement dans le fichier manage.py, par exemple:

import sys

...
...

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

J'espère que ça aide

4
Xidobix

J'ai eu le même problème mais une autre solution:

Mon dossier de projet a été nommé exactement comme l'une de mes applications.

J'ai eu :

/ 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

Ce type d’arbre ne semble pas être possible facilement ..__ J'ai changé le nom du dossier racine de mon projet et le problème a été résolu!

3
Guillaume Gendre

Permettez-moi d'ajouter et mon expérience pour cette question. Après avoir frappé la tête pendant quelques heures et essayé toutes les réponses ci-dessus, j'ai constaté que quelques lignes dans le fichier settings.py causaient le problème:

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

Après cela, j’ai fait une copie du fichier settings.py, nommé scripts_settings.py sans ces lignes, puis j’ai utilisé ce fichier et tout va bien maintenant.

1
kpacn

Dans mon cas, j'avais une importation circulaire qui était à l'origine de cette erreur. De settings.py j'importais une fonction dans un autre module, et de ce module j'importais une variable de paramètres. Pour résoudre ce problème, au lieu d'importer directement depuis les paramètres, j'ai procédé comme suit:

from Django.conf import settings
1
Caumons

(J'ai écrit cette même réponse pour un problème de déploiement Django dans Apache/mod_wsgi. ImportError: impossible d'importer les paramètres 'site.settings' si quelqu'un ne trouve que cette question.)

Cela ne semble pas être le problème dans votre cas, mais je me suis heurté à la même ImportError lorsque j'ai utilisé la directive WSGIPythonPath (au lieu du fichier .wsgi) pour configurer sys.path. Cela a bien fonctionné jusqu'à ce que je passe à l'exécution de WSGI en mode démon. Une fois que vous avez fait cela, vous devez utiliser l’argument python-path dans la directive WSGIDaemonProcess.

1
yukondude

J'allais dire que vous pouvez simplement insérer/ajouter votre répertoire de projet à votre sys.path dans votre fichier wsgi mais si votre fichier de paramètres est à

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

Ensuite, vous devriez être bon là-bas.

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

Cela résume bien ce que vous recherchez.

Intéressant que l'erreur se propage bien:

for middleware_path in settings.MIDDLEWARE_CLASSES:

mais vous avez ce qui semble être le exact par défaut .

Vous voudrez peut-être vérifier quel interpréteur python est désigné par wsgi. Souhaitez-vous utiliser virtualenv mais wsgi examine l’installation de votre système?

Vous pouvez également définir l'utilisateur et le groupe sous lesquels wsgi est exécuté. J'utilise quelque chose comme:

WSGIDaemonProcess mysite.com utilisateur = groupe skyl = processus skyl = n threads = N chemin_python =/home/skyl/pinax/pinax-env2/lib/python2.6/site-packages

0
Skylar Saveland

Au premier coup d'œil, je dirais que le chemin de Python est faux, mais comparé à Shell interactif, il a l'air correct ... alors essayez peut-être ceci:

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

setup_environ(settings)
0
Botond Béres

Je viens d'avoir cette erreur et la solution a été d'activer mon environnement virtuel via myvenv/source/activate. 

0
Casey

Ajouter deux lignes de code supplémentaires 

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

dans votre fichier wsgi sous la ligne:

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

J'ai eu un problème similaire, résolu avec l'extrait suivant dans mon 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

0
Bas