Yanlış Yapılandırılmış: Ayarlara erişmeden önce ortam değişkenini DJANGO_SETTINGS_MODULE tanımlamalı veya settings.configure () öğesini çağırmalısınız


89

Django projemi heroku'ya konuşlandırmak için yapılandırmaya çalışıyordum. Aşağıdaki hatayı alıyorum ve nasıl düzelteceğimi gerçekten bilmiyorum.

İşte tam izleme ve hata:

22:46:15 web.1  | Traceback (most recent call last):
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/arbiter.py", line 495, in spawn_worker
22:46:15 web.1  |     worker.init_process()
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/workers/base.py", line 106, in init_process
22:46:15 web.1  |     self.wsgi = self.app.wsgi()
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/app/base.py", line 114, in wsgi
22:46:15 web.1  |     self.callable = self.load()
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 62, in load
22:46:15 web.1  |     return self.load_wsgiapp()
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 49, in load_wsgiapp
22:46:15 web.1  |     return util.import_app(self.app_uri)
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/util.py", line 354, in import_app
22:46:15 web.1  |     __import__(module)
22:46:15 web.1  |   File "/Users/nir/nirla/nirla/wsgi.py", line 12, in <module>
22:46:15 web.1  |     from dj_static import Cling
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/dj_static.py", line 7, in <module>
22:46:15 web.1  |     from django.contrib.staticfiles.handlers import StaticFilesHandler as DebugHandler
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", line 8, in <module>
22:46:15 web.1  |     from django.contrib.staticfiles.views import serve
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/contrib/staticfiles/views.py", line 13, in <module>
22:46:15 web.1  |     from django.views import static
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/views/static.py", line 96, in <module>
22:46:15 web.1  |     template_translatable = ugettext_noop("Index of %(directory)s")
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/utils/translation/__init__.py", line 65, in gettext_noop
22:46:15 web.1  |     return _trans.gettext_noop(message)
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/utils/translation/__init__.py", line 52, in __getattr__
22:46:15 web.1  |     if settings.USE_I18N:
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/conf/__init__.py", line 54, in __getattr__
22:46:15 web.1  |     self._setup(name)
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/conf/__init__.py", line 47, in _setup
22:46:15 web.1  |     % (desc, ENVIRONMENT_VARIABLE))
22:46:15 web.1  | ImproperlyConfigured: Requested setting USE_I18N, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

İşte wsgi.py dosyam :

import os
from django.core.wsgi import get_wsgi_application
from dj_static import Cling

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "nirla.settings") #nirla is the name of the project


application = Cling(get_wsgi_application())

Ve alakalı olması durumunda, manage.py dosyam :

import os
import sys

    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "nirla.settings")

        from django.core.management import execute_from_command_line

        execute_from_command_line(sys.argv)

Buradaki sorunu anlayan var mı? Ve eğer öyleyse, neyin yanlış olduğunu açıklayacak kadar kibar olabilir misin? Teşekkür ederim!

Yanıtlar:


86

DJANGO_SETTINGS_MODULE'un bir şekilde ayarlanması gerektiğini düşündüm , bu yüzden belgelere baktım (bağlantı güncellendi) ve buldum:

export DJANGO_SETTINGS_MODULE=mysite.settings

Heroku'da bir sunucu çalıştırıyorsanız bu yeterli olmasa da, orada da belirtmeniz gerekir. Bunun gibi:

heroku config:set DJANGO_SETTINGS_MODULE=mysite.settings --account <your account name> 

Benim özel durumumda bu ikisini çalıştırdım ve her şey yolunda gitti:

export DJANGO_SETTINGS_MODULE=nirla.settings
heroku config:set DJANGO_SETTINGS_MODULE=nirla.settings --account personal

Düzenle

Sanal ortamınızı her kapattığınızda veya yeniden başlattığınızda bunu yeniden yapmanız gerektiğini de belirtmek isterim. Bunun yerine, venv / bin / activ'e gidip: satırını set DJANGO_SETTINGS_MODULE=mysite.settingskodun altına ekleyerek işlemi otomatikleştirmelisiniz . Artık sanal ortamı her etkinleştirdiğinizde, o uygulamanın ayarlarını kullanıyor olacaksınız.


Yani os.environ.setdefault("DJANGO_SETTINGS_MODULE", "nirla.settings")görmezden geliniyor mu?
Matej J

68

Gönderen Done Right Web Geliştirme: Kesin Django'ya Rehberi :

Daha önce Python kullandıysanız, neden python manage.py shellsadece yerine koştuğumuzu merak ediyor olabilirsiniz python. Her iki komut da etkileşimli yorumlayıcıyı başlatır, ancak manage.py shellkomutun bir temel farkı vardır: yorumlayıcıyı başlatmadan önce, Django'ya hangi ayar dosyasının kullanılacağını söyler.

Kullanım Örneği: Şablon sistemi de dahil olmak üzere Django'nun birçok bölümü ayarlarınıza güvenir ve çerçeve hangi ayarları kullanacağınızı bilmedikçe bunları kullanamazsınız.

Merak ediyorsanız, perde arkasında nasıl çalıştığını burada bulabilirsiniz. Django DJANGO_SETTINGS_MODULE, settings.py dosyanızın içe aktarma yoluna ayarlanması gereken bir ortam değişkenini arar . Örneğin, mysite'ın Python yolunuzda olduğunu varsayarak DJANGO_SETTINGS_MODULEolarak ayarlanabilir 'mysite.settings'.

Çalıştırdığınızda python manage.py shell, komut DJANGO_SETTINGS_MODULEsizin için ayarlamayla ilgilenir . **


2
Bunun için teşekkürler. Django kabuğu da aynı hatayı atsa da, sonunda bunu çözdüm. Ben yok olduğu bir özel durumda, içindeyim settings.pybenim kod tabanı dosya / modülü, ancak bir settingspaket / klasör. Bu paket, init içinde içe aktarılan __init__.pytüm geleneksel öğeleri settings.pyve diğer yerel ayarlar dosyalarını içeren bir dosya içerir . Bu yüzden aşağıdaki gibi yapılandırmam gerekiyordu:export DJANGO_SETTINGS_MODULE=myappfolder.settings.__init__
Fed Zee

Teşekkürler, yorumunuz aydınlatıcı. Django'da bir uygulama geliştiriyorum ve verileri bir excel sayfasından modele yüklemek için bir .py betiği geliştirdim. Settings.py'imin başlangıcına önerdiğiniz iki satırı ekledim, yani "django.conf içe aktarma ayarlarından", "settings.configure ()" .. Ama çalıştırdığımda konsolum "django.core'u döndürüyor. exceptions.AppRegistryNotReady: Uygulamalar henüz yüklenmedi ”ve nedenini anlayamıyorum. İşte
betiğim

42

Django'nun uygulamaya özel ayarlarınıza ihtiyacı var. Zaten içinde olduğundan manage.py, sadece onu kullanın. Daha hızlı, ancak belki de geçici çözüm şudur:

python manage.py shell

Django 2.0 Eğitimi - Bölüm 5 - Otomatikleştirilmiş testten geçerken tam da ihtiyacım olan şey buydu . Daha önce, ortamımda pythontek başına yazarak Python etkileşimli moduna girdim . Bu, yazdıktan sonra AppRegistryNotReady istisnasına yol açar from polls.models import Question.
datalifenyc

teşekkürler, django-admin shellaynı olduğunu düşündüm python manage.py shellama farklılar.
Vishesh Mangla

9

Benim durumumda, call_commandsorun yaratan modülün kullanımıydı .
Ekledim set DJANGO_SETTINGS_MODULE=mysite.settingsama işe yaramadı.

Sonunda buldum:

bu satırları komut dosyasının en üstüne ekleyin ve sıra önemlidir.

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

import django
django.setup()

from django.core.management import call_command

3

Kimlik bilgilerinizi projenizin kök dizininde tutacak ve onu sürüm oluşturma dışında bırakacak bir .env dosyası oluşturun :

$ echo ".env" >> .gitignore

.Env dosyasında değişkenleri ekleyin (bunları kurulumunuza göre uyarlayın):

$ echo "DJANGO_SETTINGS_MODULE=myproject.settings.production"> .env
#50 caracter random key
$ echo "SECRET_KEY='####'">> .env

Bunları kullanmak için, bunu production.py ayarları dosyanızın üstüne koyun:

import os

env = os.environ.copy()
SECRET_KEY = env['SECRET_KEY']

Bu mücevheri kullanarak Heroku'da yayınlayın: http://github.com/ddollar/heroku-config.git

$ heroku plugins:install git://github.com/ddollar/heroku-config.git
$ heroku config:push

Bu şekilde virtualenv dosyalarını değiştirmekten kaçınırsınız.

* Bu eğiticiye göre


1

Yerel sunucuyu kullanıyorsanız, Django kabuğunu kullanarak çalıştırın python manage.py shell. Sizi Django python ortamına götürecek ve gitmekte fayda var.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.