ข้อผิดพลาดของ Django DB Settings 'กำหนดค่าไม่ถูกต้อง'


170

Django (1.5) ใช้งานได้ดีสำหรับฉัน แต่เมื่อฉันใช้ Python interpreter (Python 3) เพื่อตรวจสอบบางสิ่งฉันได้รับข้อผิดพลาดที่แปลกประหลาดที่สุดเมื่อฉันพยายามนำเข้า - 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.

มันจะถูกตั้งค่าอย่างไม่เหมาะสมได้อย่างไรเมื่อทำงานได้ดีนอกล่าม Python? ในการตั้งค่า Django ของฉันการDATABASESตั้งค่าคือ:

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

... การกำหนดค่านี้ไม่ถูกต้องอย่างไร


ข้ามสิ่งนี้เมื่อตั้งค่าโครงการใหม่ unset DJANGO_SETTINGS_MODULEผมพบว่ามันเป็นประโยชน์ที่จะทำ ฉันพบปัญหาที่ฉันตั้งค่า env var ใน. bashrc ของฉัน
fncomp

คำตอบ:


264

คุณไม่สามารถทำให้ Python ดับไฟและตรวจสอบสิ่งต่างๆได้ Django ไม่รู้ว่าคุณต้องการทำงานโครงการอะไร คุณต้องทำสิ่งใดสิ่งหนึ่งต่อไปนี้:

  • ใช้ python manage.py shell
  • ใช้django-admin.py shell --settings=mysite.settings(หรือโมดูลการตั้งค่าใด ๆ ที่คุณใช้)
  • ตั้งค่าDJANGO_SETTINGS_MODULEตัวแปรสภาพแวดล้อมในระบบปฏิบัติการของคุณเป็นmysite.settings
  • (สิ่งนี้จะถูกลบออกใน Django 1.6) การใช้งานsetup_environใน python interpreter:

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

โดยธรรมชาติวิธีแรกนั้นง่ายที่สุด


ขอบคุณ! นั่นไม่ชัดเจนสำหรับฉันในเอกสารประกอบหรือบางทีฉันอ่านแล้วก็ลืมไปตามเวลาที่ฉันต้องการ
Zamphatta

6
ดูเหมือนจะไม่พบไฟล์ 'mysite.settings' แต่ฉันเห็นว่ามันอยู่ที่นั่นในชื่อ mysite / settings.py ฮึ ฉันเริ่มเกลียด Django
Zamphatta

3
ใช่setup_environถูกลบใน 1.6 แต่--settingsควรใช้งานได้ คุณแน่ใจหรือไม่ว่าการตั้งค่าของคุณนั้นเพิ่มเติมFirstBlog.settingsและไม่ใช่เฉพาะในsettingsไดเรกทอรีปัจจุบัน
Pavel Anossov

21
ไม่มีการใดที่ได้ผลสำหรับฉัน แต่อันนี้ทำ:$ export DJANGO_SETTINGS_MODULE="my_project.settings"
Thumbz

22
ในPyCharmสถานที่ที่จะทำคือ Run | แก้ไขการกำหนดค่า | (เช่น Unittests ในโครงการ) การกำหนดค่า | สิ่งแวดล้อม ตัวแปรสภาพแวดล้อม: DJANGO_SETTINGS_MODULE=(project directory name).settings
Bob Stein


26

ในปี 2560 กับ django 1.11.5 และ python 3.6 ( จากความคิดเห็นนี้ใช้งานได้กับ Python 2.7 ):

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

สิ่ง.pyที่คุณใส่รหัสนี้ควรอยู่ในmysite(ผู้ปกครองหนึ่ง)


ขอบคุณมากไม่มีวิธีแก้ปัญหาอื่นใดที่ใช้งานได้ในกรณีของฉัน
evnica

ทำงานกับ python 2.7 ด้วย
Александр

สิ่งนี้.pyควรอยู่ที่รูทซึ่งหมายความว่ามันพร้อมกับ Manage.py ฉันจะวางไว้ในโฟลเดอร์สุ่มได้อย่างไร
ไม่ระบุชื่อ

1
มันควรจะตั้งข้อสังเกตว่างานนี้จะมีเพียงถ้าคุณวางไว้ที่ด้านบนของไฟล์ของคุณถ้าคุณวางไว้ด้านในของสิ่งที่ต้องการif __name__ == "__main__":ก็จะไม่ทำงานอย่างถูกต้อง :)
จอชเอี

11

ใน Django 1.9 ฉันพยายามdjango-admin runserverและได้รับข้อผิดพลาดเดียวกัน แต่เมื่อฉันใช้python manage.py runserverฉันได้รับผลลัพธ์ตามที่ตั้งใจไว้ นี่อาจแก้ไขข้อผิดพลาดนี้ได้สำหรับผู้คนจำนวนมาก!


เดียวกันบน django 1.10 แต่ขณะที่พยายามรันคำสั่ง loaddata
amchugh89

4

ในกรณีของฉันฉันได้รับสิ่งนี้เมื่อพยายามเรียกใช้การทดสอบ Django ผ่าน PyCharm ฉันคิดว่าเป็นเพราะ PyCharm ไม่โหลดการตั้งค่าโครงการ Django เริ่มต้นนั่นคือการตั้งค่าที่manage.py shellเริ่มต้น หนึ่งสามารถเพิ่มไปยังจุดเริ่มต้นของสคริปต์ทดสอบหรือเพียงแค่เรียกใช้การทดสอบโดยใช้manage.py testหนึ่งสามารถเพิ่มไปยังจุดเริ่มต้นของการทดสอบสคริปต์หรือเพียงแค่เรียกใช้การทดสอบโดยใช้

รุ่น:

  • Python 3.5 (เป็น virtualenv)
  • PyCharm 2016.3.2 มืออาชีพ
  • Django 1.10

3

ในกรณีของฉันเองใน django 1.10.1 ที่ทำงานบน python2.7.11 ฉันพยายามเริ่มเซิร์ฟเวอร์โดยใช้django-admin runserverแทนที่จะเป็นmanage.py runserverในไดเรกทอรีโครงการของฉัน


0

สำหรับคนที่ใช้ IntelliJ ด้วยการตั้งค่าเหล่านี้ฉันสามารถสืบค้นจากเชลล์ (บน windows)

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.