it-swarm.it

Django Shell Nessun modulo ha nominato le impostazioni

Ho implementato Django in Apache tramite mod_wsgi. Django sta funzionando bene quando è ospitato da Apache. Tuttavia, sto provando a fare manutenzione tramite manage.py, ma quando provo a eseguirlo, ottengo l'errore:

Errore: impossibile importare le impostazioni 'myproject.settings' (È su sys.path?): Nessun modulo ha definito le impostazioni

[email protected]:~$ cd /usr/local/myproject
[email protected]:/usr/local/myproject$ ls
drwxr-xr-x 2 Apache apache   4096 2011-09-07 19:38 Apache
-rw-r--r-- 1 Apache apache      0 2011-05-25 14:52 __init__.py
-rw-r--r-- 1 Apache apache    813 2011-09-09 16:56 manage.py
drwxr-xr-x 6 Apache apache   4096 2011-09-09 16:43 myapp
-rw-r--r-- 1 Apache apache   4992 2011-09-07 19:31 settings.py
drwxr-xr-x 4 Apache apache   4096 2011-09-08 20:32 templates
-rw-r--r-- 1 Apache apache   1210 2011-09-08 14:49 urls.py

Django sembra ignorare la variabile di ambiente Django_SETTINGS_MODULE.

[email protected]:~$ cd /usr/local/myproject
[email protected]:/usr/local/myproject$ export Django_SETTINGS_MODULE=settings
[email protected]:/usr/local/myproject$ python manage.py Shell
Error: Could not import settings 'myproject.settings' (Is it on sys.path?): No module named settings
[email protected]:/usr/local/myproject$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import settings
>>> 

Giusto per confermare che non stavo impazzendo, ho commentato tutto all'interno di manage.py tranne la riga import settings, e funzionava correttamente.

Ho anche provato a impostare os.environ['Django_SETTINGS_MODULE'] = 'settings' e sys.path.append('/usr/local/myproject') direttamente nella parte superiore di manage.py, senza alcun risultato.

Cosa sta succedendo qui? Perché Django utilizza il nome del modulo impostazioni errato? Questo mi sta facendo impazzire.

21
Cerin

Questo può accadere se il tuo nome della directory principale è uguale al nome di una delle tue app. Per esempio qui ho una directory chiamata bar contenente un progetto Django con un'app chiamata anche bar:

Simons-MacBook-Pro ~/temp
$ cd bar

Simons-MacBook-Pro ~/temp/bar
$ ./manage.py Shell
Error: Could not import settings 'bar.settings' (Is it on sys.path?): No module named settings

Simons-MacBook-Pro ~/temp/bar
$ ls -l
total 48
-rw-r--r--  1 simon  staff     0 25 Oct 10:46 __init__.py
-rw-r--r--  1 simon  staff   130 25 Oct 10:46 __init__.pyc
drwxr-xr-x  7 simon  staff   238 25 Oct 10:46 bar
-rwxr-xr-x  1 simon  staff   503 25 Oct 10:46 manage.py
-rw-r--r--  1 simon  staff  5025 25 Oct 10:46 settings.py
-rw-r--r--  1 simon  staff  2658 25 Oct 10:46 settings.pyc
-rw-r--r--  1 simon  staff   556 25 Oct 10:46 urls.py

La modifica del nome della directory root in foo (o qualsiasi altra cosa diversa da bar) risolve il problema:

Simons-MacBook-Pro ~/temp/bar
$ cd ..

Simons-MacBook-Pro ~/temp
$ mv bar foo

Simons-MacBook-Pro ~/temp
$ cd foo

Simons-MacBook-Pro ~/temp/foo
$ ./manage.py Shell
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 
29
Simon Whitaker

Ho avuto un problema simile, in cui è stato restituito lo stesso errore quando ho provato a eseguire Django-admin.py startproject myapp. A risposta precedente qui mi ha aiutato a capirlo. Il problema era che in precedenza avevo indicato Django_SETTINGS_MODULE su un determinato file, che in seguito avevo eliminato. Per risolvere il problema, ho rimosso il puntatore con questo comando:

export Django_SETTINGS_MODULE=

8
Paul Meinshausen

Sembra che il percorso del tuo progetto non venga riconosciuto da wsgi. Questo è successo a me, e per risolverlo ho aggiunto questo in cima al mio file .wsgi:

import os
import sys

root_path = os.path.abspath(os.path.split(__file__)[0])
sys.path.insert(0, os.path.join(root_path, 'project_name'))
sys.path.insert(0, root_path)
7
David542

In qualche modo, se la cartella del tuo progetto è uguale all'app che contiene il file delle impostazioni e se hai __init__.py nella cartella principale del progetto, questo danneggerà wsgi. Io davvero non capisco perché ma la rimozione di questo file ha risolto questo per me.

2
Martin Massera

Anche se la risposta di Simon Whitaker (che un nome stesso dirà cose confusionarie) è certamente al punto, piuttosto che suggerire di cambiare l'intera struttura dir esistente, potrei suggerire:

Invece di usare il "malfunzionamento"/ambiguo ...

import settings

... usa il più specifico ...

from Django.conf import settings
2
Jan Kyu Peblik

Ho accidentalmente cambiato la mia variabile Django_SETTINGS_MODULE usando il comando echo: echo Django_SETTINGS_MODULE=mysite.settings

Ho semplicemente chiuso virtualenv e l'ho riattivato, ripristinando le mie impostazioni.

1
wcyn

Dal momento che la tua app Web funziona, controlla che tu stia eseguendo manage.py con lo stesso interprete python definito nel tuo file .wsgi (e se aggiungi altre directory a sys.path nel tuo file .wsgi, assicurati che siano nel pythonpath anche qui). 

Se provi ad importare qualcosa nel tuo file delle impostazioni che lancia un ImportError, Django ti dice che le impostazioni non possono essere importate. Le versioni più recenti di Django menzioneranno (If the file settings.py does indeed exist, it's causing an ImportError somehow.) e mi sono imbattuto in questo alcune volte.

Se non è così, magari provare a utilizzare Django-admin.py, nel caso in cui qualcosa è andato storto nel tuo file manage.py. AFAIK non c'è un buon motivo per modificare direttamente manage.py.

1
danny

Se stai usando wsgi/uwsgi in produzione ...

Stavo avendo lo stesso errore:

Se hai rinominato la cartella creata da Django startproject con i file setting.py e wsgi.py, controlla nel file wsgi.py la riga: os.environ.setdefault("Django_SETTINGS_MODULE", "<your_folder_name>.settings") 

Nel mio caso ho dovuto anche rinominare <your_folder_name>.

1
Renato Prado

Nel mio caso il file wsgi.py funzionava quando il sistema stava funzionando normalmente, ma stavo ottenendo l'ImportError quando provavo a fare un comando manage.py manuale come migrate o collectstatic.

Ho controllato wsgi.py per il modo in cui importa le impostazioni e ho notato che prima aggiunge il percorso delle impostazioni a sys.path come segue:

import sys
sys.path.append('/opt/server/settings')

L'ho aggiunto all'inizio di manage.py e funziona.

0
James Bradbury

Si prega di verificare la compatibilità tra la versione virtualenv e la versione di Django. quando combacia, funziona come una gemma. 

0
user6041236