不適切に構成された:設定にアクセスする前に、環境変数DJANGO_SETTINGS_MODULEを定義するか、settings.configure()を呼び出す必要があります


83

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)

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

回答:


82

DJANGO_SETTINGS_MODULEを何らかの方法で設定する必要があると考えたので、ドキュメント(リンクを更新)を見て、次のことを見つけました。

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 / activateset DJANGO_SETTINGS_MODULE=mysite.settingsに移動し、コードの最後に次の行を追加して、プロセスを自動化する必要があります。これ以降、仮想環境をアクティブ化するたびに、そのアプリの設定を使用することになります。


だからos.environ.setdefault("DJANGO_SETTINGS_MODULE", "nirla.settings")無視されますか?
Matej J

62

右の完了のWeb開発:決定的ジャンゴへのガイド

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

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

興味がある場合は、舞台裏でどのように機能するかを説明します。DjangoDJANGO_SETTINGS_MODULEは、settings.pyのインポートパスに設定する必要があるという環境変数を探します。たとえば、mysiteがPythonパス上DJANGO_SETTINGS_MODULEにある'mysite.settings'と仮定すると、に設定される可能性があります。

を実行するpython manage.py shellと、コマンドが設定DJANGO_SETTINGS_MODULEを処理します。**


2
それをありがとう。djangoシェルが同じエラーをスローしましたが、私は最終的にそれを解決しました。私は特定のケースにいます。settings.pyコードベースにファイル/モジュールはありませんが、settingsパッケージ/フォルダーがあります。このパッケージには、initにインポートされ__init__.pysettings.py、の従来のものすべてを含むファイル、およびその他のローカル設定ファイルが含まれています。:次のように設定しなければならなかった私はexport DJANGO_SETTINGS_MODULE=myappfolder.settings.__init__
連邦ジー

おかげで、あなたのコメントは光っています。私はDjangoでアプリを開発しており、Excelシートからモデルにデータをアップロードするための.pyスクリプトを開発しました。settings.pyの最初に、提案した2行、つまり「from django.conf import settings」、「settings.configure()」を追加しました。しかし、実行すると、コンソールは「django.core」を返します。 exceptions.AppRegistryNotReady:アプリはまだ読み込まれていません」と、理由がわかりません。ここに私のスクリプトでstackoverflow.com/questions/58305225/...は
Tms91

38

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

python manage.py shell

これは、Django2.0チュートリアル-パート5-自動テストを行っていたときに必要だったものです。以前は、入力するpythonだけで環境内でPythonインタラクティブモードに入りました。これにより、を入力しfrom polls.models import Questionた後にAppRegistryNotReady例外が発生します。
datalifenyc

6

私の場合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

3

プロジェクトのルートに資格情報を保持する.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ファイルを変更することを回避します。

*このチュートリアルに基づく


0

ローカルサーバーを使用している場合は、を使用してDjangoシェルを実行しpython manage.py shellます。Django python環境に移動し、準備が整います。


0

Pythonパスがプロジェクトディレクトリに正しく設定されていることを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.