web-dev-qa-db-fra.com

Comment définir correctement Django_SETTINGS_MODULE pour mon projet Django (j'utilise virtualenv)?

Je ne parviens pas à configurer Django_SETTINGS_MODULE pour mon projet Django.

J'ai un répertoire à ~/dev/Django-project. Dans ce répertoire, j'ai un environnement virtuel que j'ai configuré avec virtualenv, ainsi qu'un projet Django appelé "blossom" contenant une application appelée "onora". Lancer tree -L 3 à partir de ~/dev/Django-project/ me montre ce qui suit:

.
├── 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

J'essaie de vider mes données de la base de données avec la commande 

Django-admin.py dumpdata

Mon approche consiste à exécuter cd ~/dev/Django-project puis à exécuter source virtual_environment/bin/activate puis à exécuter Django-admin.py dumpdata

Cependant, j'obtiens l'erreur suivante:

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

J'ai fait quelques recherches sur Google et j'ai trouvé cette page: https://docs.djangoproject.com/fr/dev/topics/settings/#designating-the-settings

qui me dit que

Lorsque vous utilisez Django, vous devez lui indiquer les paramètres que vous utilisez . Pour ce faire, utilisez une variable d’environnement, Django_SETTINGS_MODULE. Le La valeur de Django_SETTINGS_MODULE doit être dans la syntaxe du chemin Python, par exemple . mysite.settings. Notez que le module de configuration devrait être sur le Python chemin de recherche d'importation.

Suite à une suggestion dans Définition de Django_SETTINGS_MODULE sous virtualenv? J'ai ajouté les lignes

export Django_SETTINGS_MODULE="blossom.settings"
echo $Django_SETTINGS_MODULE

à virtual_environment/bin/activate. Maintenant, lorsque j'exécute la commande activate afin d'activer l'environnement virtuel, la lecture de sortie s'affiche:

Django_SETTINGS_MODULE set to blossom.settings

Cela me semble bien, mais le problème que j’ai à faire est que courir

Django-admin.py dumpdata

renvoie l'erreur suivante:

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

Qu'est-ce que je fais mal? Comment puis-je vérifier lesys.path? Comment cela est-il censé fonctionner?

Merci.

32
Deonomo

N'exécutez pas Django-admin.py pour autre chose que la création initiale du projet. Pour tout ce qui suit, utilisez manage.py, qui prend en charge la recherche des paramètres.

46
Daniel Roseman

Je viens de rencontrer la même erreur et j'ai finalement réussi à comprendre ce qui se passait (le gros indice était (Is it on sys.path?) dans ImportError).

Vous devez ajouter votre répertoire de projet à PYTHONPATH - c’est ce que la documentation signifie par

Notez que le module de paramètres doit se trouver sur le chemin de recherche d'importation Python.

Pour ce faire, lancez

$ export PYTHONPATH=$PYTHONPATH:$PWD

à partir du répertoire ~/dev/Django-project avant d'exécuter Django-admin.py.

Vous pouvez ajouter cette commande (en remplaçant $PWD par le chemin réel de votre projet, i.e.~/dev/Django-project) au script source de votre virtualenv. Si vous choisissez d'avancer vers virtualenvwrapper à un moment donné (ce qui est conçu pour ce type de situation), vous pouvez ajouter la ligne export PY... au script de hook postactivate généré automatiquement. 

mkdjangovirtualenv automatise cela encore plus loin, en ajoutant l'entrée appropriée au chemin Python pour vous, mais je ne l'ai pas testée moi-même.

20
supervacuo

Sur une machine de type Unix, vous pouvez simplement alias virtualenv comme ceci et utiliser alias au lieu de taper à tout moment:

.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'

12
zzart

Je sais qu'il y a beaucoup de réponses, mais celle-ci a fonctionné pour moi uniquement pour l'enregistrement.

  1. Accédez au dossier .virtual_env où se trouvent tous les environnements virtuels.
  2. Accédez au dossier d'environnement spécifique à votre projet.
  3. Ajoutez export Django_SETTINGS_MODULE=<Django_project>.settings Ou export Django_SETTINGS_MODULE=<Django_project>.settings.local si vous utilisez un fichier de paramètres séparé stocké dans un dossier de paramètres.
0
Max

Mon alternative préférée est de passer le fichier de paramètres en tant que paramètre d’exécution à manage.py dans une syntaxe de paquet Python, par exemple:

python manage.py runserver --settings folder.filename

plus d'infos Django docs

0
chefarov

Une autre solution consiste à utiliser le package python dotenv et à inclure PYTHONPATH et Django_SETTINGS_MODULE dans le fichier .env avec vos autres variables d’environnement. Modifiez ensuite vos fichiers manage.py et wsgi.py pour les charger comme indiqué dans les instructions.

from dotenv import load_dotenv
load_dotenv()
0
aris