web-dev-qa-db-ja.com

不適切な設定:環境変数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 __== "__main__":
        os.environ.setdefault("Django_SETTINGS_MODULE", "nirla.settings")

        from Django.core.management import execute_from_command_line

        execute_from_command_line(sys.argv)

誰でもここで問題を理解しているように見えますか?もしそうなら、あなたは何が間違っているのかを説明するほど親切にすることができますか?ありがとうございました!

50
ApathyBear

私はDjango_SETTINGS_MODULEを何らかの方法で設定する必要があると考えたため、 documentation (link updated)を見て、見つけました:

export Django_SETTINGS_MODULE=mysite.settings

Herokuでサーバーを実行している場合はそれだけでは十分ではありませんが、サーバーを指定する必要もあります。このような:

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

私の特定のケースでは、これら2つを実行し、すべてがうまくいきました:

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コードの最後に。これからは、仮想環境をアクティブにするたびに、そのアプリの設定を使用します。

62
ApathyBear

The Djangoへの決定的なガイド:Web開発は正しく完了しました

以前にPythonを使用したことがある場合、なぜpythonだけでなくpython manage.py Shellを実行しているのか疑問に思うかもしれません。どちらのコマンドもインタラクティブインタープリターを起動しますが、manage.py Shellコマンドには1つの重要な違いがあります。インタープリターを起動する前に、使用する設定ファイルをDjangoに通知します。

ユースケース:テンプレートシステムを含むDjangoの多くの部分は設定に依存しており、フレームワークが使用する設定を認識しない限り、それらを使用することはできません。

興味がおありでしたら、それが舞台裏でどのように機能するかを以下に示します。 Djangoは、settings.pyのインポートパスに設定する必要があるDjango_SETTINGS_MODULEという環境変数を探します。たとえば、mysiteがPythonパス上にあるとすると、Django_SETTINGS_MODULE'mysite.settings'に設定されます。

python manage.py Shellを実行すると、コマンドがDjango_SETTINGS_MODULEを設定します。**

38
GrvTyagi

Djangoには、アプリケーション固有の設定が必要です。既にmanage.pyの中にあるので。より高速ですが、おそらく一時的な解決策は次のとおりです。

python manage.py Shell
19
AfamO

。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ファイルの変更を回避できます。

*これに基づいて チュートリアル

2
marcanuy