2012-01-11 19 views
26

Sto riscontrando qualche problema nell'impostare il DJANGO_SETTINGS_MODULE per il mio progetto Django.Come posso impostare correttamente DJANGO_SETTINGS_MODULE per il mio progetto Django (sto usando virtualenv)?

Ho una directory ~/dev/django-project. In questa directory ho un ambiente virtuale che ho impostato con virtualenv, e anche un progetto django chiamato "blossom" con un'app all'interno di esso chiamata "onora". Esecuzione tree -L 3 da ~/dev/django-project/ mi mostra il seguente:

. 
├── Procfile 
├── blossom 
│   ├── __init__.py 
│   ├── __init__.pyc 
│   ├── fixtures 
│   │   └── initial_data_test.yaml 
│   ├── manage.py 
│   ├── onora 
│   │   ├── __init__.py 
│   │   ├── __init__.pyc 
│   │   ├── admin.py 
│   │   ├── admin.pyc 
│   │   ├── models.py 
│   │   ├── models.pyc 
│   │   ├── tests.py 
│   │   └── views.py 
│   ├── settings.py 
│   ├── settings.pyc 
│   ├── sqlite3-database 
│   ├── urls.py 
│   └── urls.pyc 
├── blossom-sqlite3-db2 
├── requirements.txt 
└── virtual_environment 
    ├── bin 
    │   ├── activate 
    │   ├── activate.csh 
    │   ├── activate.fish 
    │   ├── activate_this.py 
    │   ├── django-admin.py 
    │   ├── easy_install 
    │   ├── easy_install-2.7 
    │   ├── gunicorn 
    │   ├── gunicorn_django 
    │   ├── gunicorn_paster 
    │   ├── pip 
    │   ├── pip-2.7 
    │   ├── python 
    │   └── python2.7 -> python 
    ├── include 
    │   └── python2.7 -> /System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 
    └── lib 
     └── python2.7 

Sto cercando di scaricare i miei dati dal database con il comando

django-admin.py dumpdata 

Il mio approccio è quello di eseguire cd ~/dev/django-project e quindi eseguire source virtual_environment/bin/activate e quindi eseguire django-admin.py dumpdata

Tuttavia, sto ottenendo il seguente errore:

ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined. 

ho fatto qualche googling e trovato questa pagina: https://docs.djangoproject.com/en/dev/topics/settings/#designating-the-settings

che mi dicono che

When you use Django, you have to tell it which settings you're using. Do this by using an environment variable, DJANGO_SETTINGS_MODULE. The value of DJANGO_SETTINGS_MODULE should be in Python path syntax, e.g. mysite.settings. Note that the settings module should be on the Python import search path.

A seguito di un suggerimento a Setting DJANGO_SETTINGS_MODULE under virtualenv? ho aggiunti le linee

export DJANGO_SETTINGS_MODULE="blossom.settings" 
echo $DJANGO_SETTINGS_MODULE 

a virtual_environment/bin/attivare. Ora, quando si esegue il comando di attivazione per attivare l'ambiente virtuale, ottengo la lettura di uscita:

DJANGO_SETTINGS_MODULE set to blossom.settings 

Questo sembra buono per me, ma ora il problema che ho è che in esecuzione

django-admin.py dumpdata 

restituisce il seguente errore:

ImportError: Could not import settings 'blossom.settings' (Is it on sys.path?): No module named blossom.settings 

Cosa sto facendo male? Come posso verificare lo sys.path? Come dovrebbe funzionare?

Grazie.

risposta

40

Non eseguire django-admin.py per scopi diversi dalla creazione iniziale del progetto. Dopo tutto, usa manage.py, che si occupa della ricerca delle impostazioni.

+1

Grazie - 'python blossom/manage.py dumpdata' ha funzionato come previsto. – Deonomo

+0

Vero. Allora perché i documenti di django dicono "Usa esattamente uno dei due configure() o DJANGO_SETTINGS_MODULE. Non entrambi e ** non neanche **." ? https://docs.djangoproject.com/en/dev/topics/settings/ – lajarre

+7

Pensiero corrente - come descritto nel sito ["DeployDjango"] (http://www.deploydjango.com/django_project_structure/index.html) e il recente * [Two Scoops of Django] (http://django.2scoops.org/) * book - è che 'django-admin.py' con impostazioni separate funziona perfettamente, ed è in realtà preferibile usare' manage. py'. – supervacuo

15

Ho appena riscontrato lo stesso errore e alla fine sono riuscito a capire cosa stava succedendo (il grande indizio era (Is it on sys.path?) nello ImportError).

dovete aggiungere directory del progetto per PYTHONPATH - questo è ciò che significa la documentazione da

Note that the settings module should be on the Python import search path.

Per fare ciò, eseguire

$ export PYTHONPATH=$PYTHONPATH:$PWD 

dalla directory ~/dev/django-project prima di eseguire django-admin.py.

È possibile aggiungere questo comando (sostituendo $PWD con il percorso effettivo al progetto, vale a dire ~/dev/django-project) per lo script del vostro virtualenv source. Se si sceglie di passare a virtualenvwrapper ad un certo punto (progettato per questo tipo di situazione), è possibile aggiungere la linea export PY... allo script di hook generato automaticamente da postactivate.

mkdjangovirtualenv automatizza ulteriormente, aggiungendo la voce appropriata al percorso Python per te, ma non l'ho ancora testato.

+0

Sporco. Ma funziona e utile. Stai incoraggiando problemi di elusione. Se qualcosa non è su sys.path, questo significa che deve essere impacchettato e installato, non hackerato su sys.path. Lo so, sto risolvendo un problema, creando altri due. – bartekbrak

+0

Interessante: come pensi che un progetto Django in fase di sviluppo debba essere aggiunto a 'sys.path', se non da' manage.py', 'django-admin.py' all'opzione '--pythonpath', o 'PYTHONPATH' env var (nessuno dei quali sembra più" sporco "degli altri ..) – supervacuo

+1

Imballalo (crea setup.py) e installa tramite pip inestall [-e]. Dai un'occhiata a un'esplosione più lunga: https://gist.github.com/bartekbrak/42d59fd43a9af14a0cc5 – bartekbrak

10

Sulla macchina UNIX-like si può semplicemente alias virtualenv come questo e utilizzare alias invece di digitare ogni volta:

.bashrc

alias cool='source /path_to_ve/bin/activate; export DJANGO_SETTINGS_MODULE=django_settings_folder.settings; cd path_to_django_project; export PYTHONPATH=$PYTHONPATH:$PWD'

+3

questo in realtà ha risolto il mio problema rispetto alle altre risposte. Grazie! –

0

So che ci sono risposte abbondanza, ma questo ha lavorato per me solo per la cronaca.

  1. Passare alla cartella .virtual_env in cui si trovano tutti gli ambienti virtuali.
  2. Passare alla cartella ambiente specifico al progetto
  3. Append "export DJANGO_SETTINGS_MODULE = .settings o "DJANGO_SETTINGS_MODULE export = .settings.local" se si utilizza un file di impostazioni separate memorizzato in una cartella impostazioni
0

la mia alternativa preferita sta passando file di impostazioni come parametro di runtime per manage.py in una sintassi pacchetto python, ad esempio:

python manage.py runserver --settings folder.filename 

maggiori informazioni django docs

Problemi correlati