アプリケーションが開発サーバーで実行されているかどうかを確認するにはどうすればよいですか? settings.DEBUG
の値を確認し、DEBUG
がTrue
であると仮定すると、開発サーバーで実行されていると思いますが、慣例に頼るよりも確実に知りたいと思います。
server = request.META.get('wsgi.file_wrapper', None)
if server is not None and server.__module__ == 'Django.core.servers.basehttp':
print('inside dev')
もちろん、wsgi.file_wrapper
がMETAで設定され、Django.core.servers.basehttp
という名前のモジュールのクラスが別のサーバー環境で偶然一致している場合もありますが、これでカバーできると思います。
ちなみに、開発サーバーで実行中に構文的に無効なテンプレートを作成することでこれを発見し、Traceback
セクションとRequest information
セクションで興味深いものを検索したので、私の回答を編集していますネイトのアイデアを裏付けるために。
標準の開発サーバーと本番環境を区別するために、settings.pyに次のコードを追加しました。
import sys
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
ただし、これは規約にも依存しています。
(Daniel Magnussonのコメントに従って修正)
通常、environment
という変数を設定し、それを "DEVELOPMENT"、 "STAGING"、または "PRODUCTION"に設定します。設定ファイル内で、環境に基づいて、使用されている設定を変更するための基本的なロジックを追加できます。
編集:さらに、このロジックを使用して、基本設定を上書きするさまざまなsettings.py
ファイルを含めることができます。例えば:
if environment == "DEBUG":
from debugsettings import *
通常これは動作します:
import sys
if 'runserver' in sys.argv:
# you use runserver
Settings.DEBUGは、Djangoコードベースでも使用される場合があるため、AFAICSの最もエレガントな方法です。
私が本当に望んでいるのは、プロジェクトを運用サーバーにアップロードするたびに手動で更新する必要なく、そのフラグを自動的に設定する方法だと思います。
そのために、settings.py(settings.py内)のパスを確認して、プロジェクトが実行されているサーバーを特定します。
if __file__ == "path to settings.py in my development machine":
DEBUG = True
Elif __file__ in [paths of production servers]:
DEBUG = False
else:
raise WhereTheHellIsThisServedException()
@Soviutが示唆するように、環境変数を使用してこのチェックを行うこともできます。しかし、誰かがWindowsで開発し、Linuxでサービスを提供しているので、ファイルパスをチェックすることは、環境変数を使用するよりもはるかに簡単でした。
私はたった今この問題に遭遇し、Aryeh Leib Taurogのような解決策を書いてしまいました。私の主な違いは、サーバーを実行するときだけでなく、アプリの一時スクリプトを実行するときにも、本番環境と開発環境を区別したいということです(私はDjango_SETTINGS_MODULE = settings python [スクリプト])。この場合、argv [1] == runserverでは不十分かどうかを確認するだけなので、思いついたのは、devserverを実行するときと、スクリプトを実行し、settings.pyでその引数を探すだけなので、コードは次のようになります。
if '--in-development' in sys.argv:
## YES! we're in dev
pass
else:
## Nope, this is prod
pass
次に、Djangoサーバーを実行すると
python manage.py runserver [あなたが望むオプションは何でも] --in-development
スクリプトを実行するのは簡単です
Django_SETTINGS_MODULE = settings python [myscript] --in-development
渡す追加の引数が何かと衝突しないことを確認してくださいDjango(実際、私は引数の一部としてアプリの名前を使用しています。)これはかなり適切だと思います私は自分のサーバーとスクリプトがいつprodまたはdevとして動作するかを正確に制御します。私は自分のもの以外の規則に依存していません。
編集:manage.pyは、認識されないオプションを渡すと文句を言うので、settings.pyのコードを次のように変更する必要があります
if sys.argv[0] == 'manage.py' or '--in-development' in sys.argv:
# ...
pass
これは機能しますが、最もエレガントなソリューションではないことを認識しています...
ランタイム環境に応じて設定ファイルを自動的に切り替える場合は、環境が異なるものを使用できます。
from os import environ
if environ.get('_', ''):
print "This is dev - not Apache mod_wsgi"
開発環境と配備環境の違いの1つは、それが実行されるサーバーです。正確に何が異なるかは、開発環境とデプロイメント環境によって異なります。
独自の開発環境と配備環境を知っている場合、HTTP要求変数を使用して2つを区別できます。 request.META.HTTP_Host
、request.META.SERVER_NAME
、request.META.SERVER_PORT
などの リクエスト変数 を見て、2つの環境で比較します。
きっと、明らかに異なるものを見つけて、開発環境の検出に使用できるはずです。 settings.py
でテストを行い、他の場所で使用できる変数を設定します。
私が使う:
_DEV_SERVERS = [
'mymachine.local',
]
DEVELOPMENT = platform.node() in DEV_SERVERS
_
これは、マシンの.node()
が返すものに注意を払う必要があります。機密の開発情報を誤って公開しないように、デフォルトは非開発であることが重要です。
コンピュータを一意に識別するより複雑な方法 を調べることもできます。
settings.DEBUGはTrueで、Apacheまたは他の非開発サーバーで実行されている可能性があります。それでも実行されます。私の知る限り、ランタイム環境には、pidを調べてOSのpidと比較するだけで、この情報が得られます。
WSGI
(mod_wsgi、gunicorn、ウェイトレスなど)で実行しているか、manage.py
(runserver、test、migrateなど)で実行しているか、またはその他の何かを実行しているかどうかを判断できます。
import sys
WSGI = 'Django.core.wsgi' in sys.modules
Aryehの回答に触発されて、私が自分で使用するために考案したトリックは、sys.argv[0]
で管理スクリプトの名前を探すだけです。
USING_DEV_SERVER = "pulpdist/manage_site.py" in sys.argv[0]
(私の使用例は、テストサーバーの実行時にDjangoネイティブ認証を自動的に有効にすることです-Apacheで実行している場合、開発サーバー上でも、現在のプロジェクトのすべての認証はKerberos経由で処理されます)
あなたはチェックすることができますrequest.META["SERVER_SOFTWARE"]
値:
dev_servers = ["WSGIServer", "Werkzeug"]
if any(server in request.META["SERVER_SOFTWARE"] for server in dev_servers):
print("is local")