[python] 부적절한 구성 : 설정에 액세스하기 전에 환경 변수 DJANGO_SETTINGS_MODULE을 정의하거나 settings.configure ()를 호출해야합니다.

내 django 프로젝트를 heroku에 배포하도록 구성하려고했습니다. 다음과 같은 오류가 발생하는데 실제로 해결 방법을 모르겠습니다.

다음은 전체 역 추적 및 오류입니다.

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.

다음은 내 wsgi.py 파일입니다.

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())

그리고 관련이있는 경우 내 manage.py 파일 :

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)

누구든지 여기서 문제를 이해할 수 있습니까? 그렇다면, 무엇이 잘못되었는지 설명 할 수있을 정도로 친절 할 수 있습니까? 감사합니다!



답변

DJANGO_SETTINGS_MODULE 을 어떤 식 으로든 설정해야 한다고 생각 했기 때문에 문서 (링크 업데이트 됨)를보고 다음을 발견했습니다.

export DJANGO_SETTINGS_MODULE=mysite.settings

heroku에서 서버를 실행하는 경우 충분하지 않지만 거기에서도 지정해야합니다. 이렇게 :

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

내 특정한 경우에는이 두 가지를 실행했고 모든 것이 해결되었습니다.

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

편집하다

또한 가상 환경을 닫거나 다시 시작할 때마다이 작업을 다시 수행해야한다는 점을 지적하고 싶습니다. 대신 venv / bin / activate set DJANGO_SETTINGS_MODULE=mysite.settings로 이동하여 코드 하단에 다음 줄을 추가하여 프로세스를 자동화해야 합니다. 이제부터는 가상 환경을 활성화 할 때마다 해당 앱의 설정을 사용하게됩니다.


답변

에서 마우스 오른쪽 완료 웹 개발 : 확실한 장고에 가이드 :

이전에 파이썬을 사용한 적이 있다면, 당신은 우리가 실행하는 이유 궁금 할 python manage.py shell대신에 단지 python. 두 명령 모두 대화 형 인터프리터를 시작하지만이 manage.py shell명령에는 한 가지 중요한 차이점이 있습니다. 인터프리터를 시작하기 전에 사용할 설정 파일을 Django에 알려줍니다.

사용 사례 : 템플릿 시스템을 포함하여 Django의 많은 부분은 사용자의 설정에 의존하며 프레임 워크가 사용할 설정을 알지 못하면 사용할 수 없습니다.

궁금한 점이 있다면 다음과 같이 배후에서 작동합니다. Django는 DJANGO_SETTINGS_MODULEsettings.py의 가져 오기 경로로 설정되어야하는 라는 환경 변수를 찾습니다 . 예를 들어 mysite가 Python 경로에 있다고 가정하면 DJANGO_SETTINGS_MODULE이로 설정 될 수 있습니다 'mysite.settings'.

을 실행 python manage.py shell하면 명령이 자동으로 설정 DJANGO_SETTINGS_MODULE을 처리합니다. **


답변

Django는 애플리케이션 별 설정이 필요합니다. 이미 내부에 있으므로 manage.py사용 하십시오 . 더 빠르지 만 일시적인 해결책은 다음과 같습니다.

python manage.py shell


답변

제 경우 call_command에는 문제를 일으킨 모듈을 사용했습니다 .
추가 set DJANGO_SETTINGS_MODULE=mysite.settings했지만 작동하지 않았습니다.

마침내 찾았습니다.

스크립트 맨 위에이 줄을 추가하면 순서가 중요합니다.

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

import django
django.setup()

from django.core.management import call_command


답변

크리에이트 은 .env 프로젝트의 루트에 자격 증명을 잡고 버전의 그것을 떠나 파일 :

$ echo ".env" >> .gitignore

.env 파일에서 변수를 추가합니다 (설치에 따라 조정).

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

이를 사용하려면 production.py 설정 파일 위에 다음을 입력하십시오.

import os

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

이 gem을 사용하여 Heroku에 게시합니다 : http://github.com/ddollar/heroku-config.git

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

이렇게하면 virtualenv 파일을 변경하지 않아도됩니다.

*이 튜토리얼을 기반으로 함


답변

로컬 서버를 사용하는 경우 python manage.py shell. Django python 환경으로 이동하면 좋습니다.


답변

Python 경로가 프로젝트 디렉토리에 올바르게 설정되어 있는지 확인하십시오.