Comment puis-je cesser d’obtenir ImportError: Impossible d’importer les parameters ‘mofin.settings’ lors de l’utilisation de django avec wsgi?

Je ne peux pas obtenir wsgi pour importer mon fichier de parameters 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 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 (runserver | shell | syncdb | test store) tout comme 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 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 / trunk ‘,’ / home / django / mofin / trunk / 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 parameters Django ressemble à ceci: # Paramètres de 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 ssortingng for localhost. Not used with sqlite3. DATABASE_PORT = '' # Set to empty ssortingng 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.consortingb.sessions.middleware.SessionMiddleware', 'django.consortingb.auth.middleware.AuthenticationMiddleware', ) ROOT_URLCONF = 'mofin.urls' TEMPLATE_DIRS = ( # Put ssortingngs 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.consortingb.auth', 'django.consortingb.contenttypes', 'django.consortingb.sessions', 'django.consortingb.sites', 'django.consortingb.admin', 'mofin.store' ) 

Cela peut également se produire si une application (sous-répertoire du projet contenant un fichier init) contient le même nom que le projet. Votre fichier settings.py est peut-être dans votre dossier de projet, mais il semble qu’une partie du système django recherche d’abord un module dans le projet du même nom que le projet et qu’il ne trouve pas de parameters.py , 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 pour vérifier si quelqu’un d’autre a ce problème. S’applique à Django 1.3 et probablement à d’autres.

J’ai eu un problème de permissions similaire, et bien que mes settings.py aient les bonnes permissions, les .pyc ne l’ont pas fait !!! Alors faites attention à cela.

Hey, juste en ajoutant une réponse supplémentaire à ce problème. J’ai eu exactement le même problème, mais ce n’était pas des permissions de fichiers. J’ajoutais “path / to / project”, mais pas aussi “path / to”. Linked est l’ explication d’intégration Django de mod_wsgi qui m’a montré la réponse.

J’ai trouvé la réponse … permissions de fichier. / home / django a été défini sur 700. Par exemple, seul django peut voir le contenu. Apache s’exécute comme Apache et ne peut donc pas se passer de / home / django.

Je pense que vous devez avoir une barre oblique sur ce que je dois faire dans mon script wsgi en 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() 

Une autre cause de ce problème est que vous ne pouvez pas nommer votre application comme un autre module Python. Par exemple, j’ai appelé le site mine, en réalisant que ce site est déjà un module python.

Vous pouvez le vérifier en démarrant python et en exécutant le 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 tente d’importer des site.settings qui n’existe pas.

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’append 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

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

Mon dossier de projet a été nommé exactement comme l’un de mes applications.

J’avais :

/ 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 genre 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!

(J’ai écrit cette même réponse pour le problème de déploiement de Django dans Apache / mod_wsgi. ImportError: Impossible d’importer les parameters ‘site.settings’ au cas où quelqu’un trouverait seulement cette question.)

Cela ne semble pas être le problème dans votre cas, mais je suis tombé sur le 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 faites cela, vous devez utiliser l’argument python-path pour la directive WSGIDaemonProcess.

Dans mon cas, j’ai eu une importation circulaire qui causait cette erreur. Depuis settings.py j’importais une fonction dans un autre module et à partir de ce module, j’importais une variable de parameters. Pour y remédier, au lieu d’importer directement depuis les parameters, j’ai fait ceci:

 from django.conf import settings 

Laissez-moi append et mon expérience pour cette question. Après avoir claqué la tête pendant quelques heures et essayé toutes les réponses ci-dessus, j’ai trouvé que quelques lignes du fichier settings.py posaient 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 de settings.py, nommé scripts_settings.py sans ces lignes, et j’ai utilisé ce fichier et tout va bien maintenant.

Au premier abord, je dirais que le chemin de python est incorrect, mais comparé au shell interactif, il semble correct. Alors peut-être essayez ceci:

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

J’allais dire que vous pouvez simplement insérer / append votre répertoire de projet à votre sys.path dans votre fichier wsgi, mais si votre fichier de parameters 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 assez bien ce que vous recherchez.

Intéressant que l’erreur se propage si:

 for middleware_path in settings.MIDDLEWARE_CLASSES: 

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

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

Vous pouvez également définir l’utilisateur et le groupe sous lesquels s’exécute wsgi. J’utilise quelque chose comme:

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

Ajouter deux lignes de code supplémentaires

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

à votre fichier wsgi sous la ligne:

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

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

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