Erreur de configuration incorrecte des paramètres de la base de données Django


170

Django (1.5) fonctionne bien pour moi, mais lorsque je lance l'interpréteur Python (Python 3) pour vérifier certaines choses, j'obtiens l'erreur la plus étrange lorsque j'essaye d'importer - from django.contrib.auth.models import User-

Traceback (most recent call last):
  File "/usr/local/lib/python3.2/dist-packages/django/conf/__init__.py", line 36, in _setup
    settings_module = os.environ[ENVIRONMENT_VARIABLE]
  File "/usr/lib/python3.2/os.py", line 450, in __getitem__
    value = self._data[self.encodekey(key)]
KeyError: b'DJANGO_SETTINGS_MODULE'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.2/dist-packages/django/contrib/auth/models.py", line 8, in <module>
    from django.db import models
  File "/usr/local/lib/python3.2/dist-packages/django/db/__init__.py", line 11, in <module>
    if settings.DATABASES and DEFAULT_DB_ALIAS not in settings.DATABASES:
  File "/usr/local/lib/python3.2/dist-packages/django/conf/__init__.py", line 52, in __getattr__
    self._setup(name)
  File "/usr/local/lib/python3.2/dist-packages/django/conf/__init__.py", line 45, in _setup
    % (desc, ENVIRONMENT_VARIABLE))

django.core.exceptions.ImproperlyConfigured: Requested setting DATABASES, 
  but settings are not configured. You must either define the environment 
  variable DJANGO_SETTINGS_MODULE or call settings.configure() 
  before accessing settings.

Comment pourrait-il être mal configuré, alors qu'il fonctionne bien en dehors de l'interpréteur Python? Dans mes paramètres Django, les DATABASESparamètres sont:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'django_db', # Or path to database file if using sqlite3.
        # The following settings are not used with sqlite3:
        'USER': 'zamphatta',
        'PASSWORD': 'mypassword91',
        'HOST': '', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '', # Set to empty string for default.
    }
}

... comment est-ce mal configuré?


Je suis tombé sur cela lors de la mise en place d'un nouveau projet. J'ai trouvé cela utile à faire unset DJANGO_SETTINGS_MODULE. Je rencontrais un problème où j'avais défini la var d'
environnement

Réponses:


264

Vous ne pouvez pas simplement lancer Python et vérifier les choses, Django ne sait pas sur quel projet vous voulez travailler. Vous devez faire l'une de ces choses:

  • Utilisation python manage.py shell
  • Utilisation django-admin.py shell --settings=mysite.settings (ou quel que soit le module de paramètres que vous utilisez)
  • Définissez DJANGO_SETTINGS_MODULEla variable d'environnement de votre système d'exploitation surmysite.settings
  • (Ceci est supprimé dans Django 1.6) Utilisation setup_environdans l'interpréteur python:

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

Naturellement, la première méthode est la plus simple.


Merci! Ce n'était pas tout à fait clair pour moi dans la documentation, ou peut-être que je l'ai lu et oublié au moment où j'avais besoin de le faire.
Zamphatta

6
Curieusement, il semble impossible de trouver le fichier «mysite.settings», mais je peux le voir assis juste là sous le nom mysite / settings.py. Pouah! Je commence à détester Django.
Zamphatta

3
Oui, setup_environest supprimé dans 1.6, mais --settingsdevrait fonctionner. Êtes-vous sûr que vos paramètres sont plus loin FirstBlog.settings, et pas seulement settingsdans le répertoire actuel?
Pavel Anossov

21
Rien de ce qui précède n'a fonctionné pour moi, mais celui-ci a fonctionné:$ export DJANGO_SETTINGS_MODULE="my_project.settings"
Thumbz

22
Dans PyCharm, l'endroit pour faire cela est Run | Modifier les configurations | (par exemple Unittests dans le projet) | Configuration | Environnement | Variables d'environnement: DJANGO_SETTINGS_MODULE=(project directory name).settings
Bob Stein

41

Dans votre shell python / ipython, faites:

from django.conf import settings

settings.configure()

11
Apps aren't loaded yet.
Daniil Mashkin

26

En 2017 avec django 1.11.5 et python 3.6 (d' après le commentaire, cela fonctionne également avec Python 2.7 ):

import django
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
django.setup()

Le .pydans lequel vous mettez ce code devrait être dans mysite(le parent)


Merci beaucoup, aucune des autres solutions n'a fonctionné dans mon cas
evnica

Travaillez aussi avec python 2.7
Александр

Cela .pydoit être placé à la racine , ce qui signifie qu'il est avec manage.py. Comment le placer dans des dossiers aléatoires?
anonyme le

1
Il convient de noter que cela ne fonctionnera que si vous le mettez en haut de votre fichier, si vous le mettez dans quelque chose comme if __name__ == "__main__":ça ne fonctionnera pas correctement :)
Josh Correia

11

Sur Django 1.9, j'ai essayé django-admin runserveret j'ai eu la même erreur, mais quand j'ai utilisé, python manage.py runserverj'ai obtenu le résultat escompté. Cela peut résoudre cette erreur pour beaucoup de gens!


idem, sur django 1.10, mais en essayant d'exécuter la commande loaddata
amchugh89

4

Dans mon cas, j'ai obtenu cela en essayant d'exécuter des tests Django via PyCharm. Je pense que c'est parce que PyCharm ne charge pas les paramètres initiaux du projet Django, c'est-à-dire ceux qui manage.py shells'exécutent initialement. On peut les ajouter au début du script de test ou simplement exécuter les tests en utilisant manage.py test.

Versions:

  • Python 3.5 (dans virtualenv)
  • PyCharm 2016.3.2 Professionnel
  • Django 1.10

3

dans mon propre cas dans django 1.10.1 fonctionnant sur python2.7.11, j'essayais de démarrer le serveur en utilisant django-admin runserverplutôt que manage.py runserverdans mon répertoire de projet.


0

Pour les personnes utilisant IntelliJ, avec ces paramètres, j'ai pu interroger depuis le shell (sous Windows).

entrez la description de l'image ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.