2009-09-11 9 views
63

No puedo obtener wsgi para importar mi archivo de configuración para mi proyecto 'mofin'.¿Cómo dejo de obtener ImportError: no se pueden importar las configuraciones 'mofin.settings' cuando se usa django con wsgi?

La lista de errores del registro de errores de Apache son los siguientes

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 

me dieron el "Hello World!" La aplicación wsgi listada aquí (http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide) funciona bien.

El archivo settings.py carga bien con python manage.py (runserver | shell | syncdb | test store) como lo hace la aplicación.

Aquí está mi archivo 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 tal como figura en el registro de errores es

['/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 abro un shell interactivo con manage.py, es 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']

Mi archivo de configuración de Django es el siguiente: # configuración de Django para mofin Pro ject.

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' 
) 
+2

comprobar la respuesta de esta pregunta: ¿ http://stackoverflow.com/questions/4194243/django-wgsi-paths – radztech

Respuesta

4

Posible problema:

se le olvidó el archivo __init__.py, que debe estar en su proyecto y en todos los directorios que considere un módulo de Python para la importación.

Otra cosa que podría intentar es agregar la ruta directamente en el archivo manage.py, como:

import sys 

... 
... 

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

espero que ayude

+0

Gracias Xidobix, he encontrado otro módulo sin un archivo __init__.py, la fijación que fija el sitio de administración en runserver, pero esto todavía no está funcionando. Agregar las rutas directamente tampoco lo solucionó. Creo que crearé un proyecto extremadamente simple e intentaré que funcione y seguir desde allí. – Dan

+0

Lo simplifiqué aún más, creé un nuevo proyecto con "django-admin.py startproject maní" modifiqué el archivo wsgi para que apunte a "maní.ajustes" en su lugar maní funciona bien con runserver pero el mismo error con wsgi. ¿Podría ser algo relacionado con los permisos de archivos, la propiedad de archivos o algunas otras variables de entorno que son diferentes entre runserver y wsgi? – Dan

+0

Dan, sinceramente nunca he usado wsgi, uso mod_python. Pero al final de la guía que está leyendo, hay un enlace a http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango. Debe haber la respuesta que está buscando. ¡Buena suerte! – Xidobix

0

A primera vista diría que el camino es pitón mal, pero en comparación con el shell interactivo se ve bien. Así que tal vez intente esto:

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

setup_environ(settings) 
0

que iba a decir que sólo se puede insertar/añadir el directorio del proyecto a su sys.path en su archivo wsgi pero si archivo de la configuración está en

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

Entonces deberías ser bueno allí.

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

Eso prácticamente resume lo que estás buscando.

interesante que el error se propaga sin embargo:

for middleware_path in settings.MIDDLEWARE_CLASSES: 

pero que tiene lo que parece ser el exact default.

Es posible que desee comprobar qué intérprete de python apunta por wsgi. ¿Pretendes usar un virtualenv pero wsgi está mirando la instalación de tu sistema?

También puede configurar el usuario y el grupo con el que se está ejecutando wsgi.Utilizo algo como:

WSGIDaemonProcess mysite.com grupo de usuarios = = skyl procesos skyl = n = N hilos pitón-path =/home/skyl/Pinax/pinax-env2///site-python2.6 paquetes lib

8

Encontré la respuesta ... permisos de archivos./home/django se configuró en 700. es decir, solo django puede ver los contenidos. apache se ejecuta como Apache y no puede pasar/home/django.

+7

¿Cuál es el permiso más seguro para dar ese directorio que permitirá a Apache leerlo? –

21

Tuve un problema de permisos similar, y aunque mi settings.py tenía los permisos adecuados, ¡el .pyc no lo hizo! Así que ten cuidado con esto.

+6

+1 acaba de tener un problema similar al de OP y la eliminación * .pyc lo resolvió, así que gracias. esto parece funcionar muy bien 'alias rmpyc =" buscar. -name "* .pyc" -exec rm -rf {} \; "' para 'limpiar' un proyecto –

+0

+1 Me sucedió cuando restauré mi Mac, ¡gracias! –

18

Oye, solo agrego una respuesta adicional a este problema. Tenía exactamente el mismo problema, pero no era un permiso de archivo. Estaba agregando "ruta/a/proyecto", pero no agregando "ruta/a". Linked es el Django integration explanation de mod_wsgi que me mostró la respuesta.

+4

'os de importación, sys base = os.path.dirname (os.path.dirname (__ file__)) base_parent = os.path.dirname (base) sys.path.append (base) sys.path .append (base_parent) 'Antes de cualquier otra instrucción py. Resuelve el problema. Gracias por la pista :-) – nemesisfixx

48

Esto también puede ocurrir si tiene una aplicación (subdirectorio al proyecto con un archivo init) nombrado de la misma manera que el proyecto. Su archivo settings.py puede estar en su carpeta de proyecto, pero parece que una parte del sistema django busca primero un módulo dentro del proyecto con el mismo nombre que el proyecto y cuando no puede encontrar un settings.py allí , falla con un mensaje engañoso.

-uniquename1 

---settings.py 

---manage.py 

---application1 

-----file.py 

-----file2.py 

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

-----file.py 

-----file2.py 

Algo más para comprobar si alguien más tiene este problema. Se aplica a Django 1.3 y probablemente a otros.

+3

¿hay alguna otra solución y luego renombrar directorios? –

+0

No busqué soluciones en ese momento, pero si esto sigue sucediendo, supongo que no es un problema que los desarrolladores hayan priorizado todavía. Cavar en la razón de esto está más allá de mis habilidades. Estoy seguro de que está en el sistema central donde deberían realizarse los cambios. – shanemgrey

+0

No creo que tengas razón, Shaneveeg. En mi caso, el "settings.py" está en el "segundo nivel" de la carpeta del proyecto como se ve aquí al hacer "django-admin.py startproject mysite": https://docs.djangoproject.com/en/1.6/ intro/tutorial01/ – Timo

3

he tenido el mismo problema, pero otra solución:

Mi carpeta del proyecto se llamaba exactamente como uno de mi solicitud.

que tenía:

/home/myApp
/home/myApp/settings.py
/home/myApp/manage.py
/home/myApp/rights.py
/home/myApp/estática/
/home/myApp/estática/
/home/myApp/myApp /model.py
/home/myApp/myApp /admin.py
/home/myApp/myApp /views.py

Este tipo de árbol no parece ser posible con facilidad. ¡Cambié el nombre de la carpeta raíz de mi proyecto y el problema fue resuelto!

+1

Creo que esto ahora es posible (1.4) ya que no veo este problema. https://code.djangoproject.com/ticket/1908 –

+1

este problema ocurre solo si tiene un archivo __init__.py en la carpeta raíz del proyecto, ya que confunde al importador al pensar que este es un módulo que se puede importar (en su lugar de mirar el módulo con el mismo nombre dentro de él) – tato

7

Creo que es necesario tener una barra inclinada hacia adelante en eso es lo que tengo que hacer en mi script wsgi en apache antes de cargar 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() 

En mi caso

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

Este era mi problema. ¡Agregar el segundo enunciado adjunto lo solucionó! ¡Gracias por la ayuda! –

+0

¡alguien debería votar esta respuesta! ** la barra inclinada ** es necesaria cuando agrega a PYTHONPATH. ¡ridículo! se comió una hora de mi tiempo. –

1

(I redactó esta misma respuesta para Django deployment problem in Apache/mod_wsgi. ImportError: Could not import settings 'site.settings' en caso de que alguien sólo encuentra esta pregunta.)

Este no parece ser el problema en su caso, pero me encontré con el mismo ImportError cuando utilicé la directiva WSGIPythonPath (en lugar del archivo .wsgi) para configurar sys.path.Eso funcionó bien hasta que cambié a ejecutar WSGI en modo daemon. Una vez que lo haga, deberá usar el argumento python-path a la directiva WSGIDaemonProcess.

6

Otra causa de este problema es que no puede nombrar su aplicación igual que otro módulo de python. Por ejemplo, llamé al mío site, sin darme cuenta de que site ya es un módulo de Python.

Puede comprobar esto iniciando python, y ejecutando import site, help(site), y le mostrará que no está utilizando su módulo. Por supuesto, esto le da errores cuando django intenta importar site.settings que no existe.

0

Añadir dos líneas más de código

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

a su archivo wsgi debajo de la línea:

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

En mi caso, tuve un importación circular que estaba causando este error. Desde settings.py estaba importando una función en otro módulo, y desde ese módulo estaba importando una variable de configuración. Para solucionarlo, en lugar de importar directamente de configuración, que hizo esto:

from django.conf import settings 
0

tuve un problema similar, lo resolvió con el siguiente fragmento en mi pitón:

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 

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

1

Permítanme agregar y mi experiencia para ese tema. Después de golpearse la cabeza durante unas horas y tratar todos de las respuestas anteriores he encontrado que algunas líneas en el archivo settings.py causan el problema:

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

Después de que hice copia de la settings.py, llamado scripts_settings.py whithout esas líneas, y usaron ese archivo y todo está bien ahora.

0

Acabo de tener este error y la solución fue habilitar mi entorno virtual a través de myvenv/source/activate.

Cuestiones relacionadas