web-dev-qa-db-ja.com

Djangoアプリケーションが開発サーバーで実行されているかどうかを確認するにはどうすればよいですか?

アプリケーションが開発サーバーで実行されているかどうかを確認するにはどうすればよいですか? settings.DEBUGの値を確認し、DEBUGTrueであると仮定すると、開発サーバーで実行されていると思いますが、慣例に頼るよりも確実に知りたいと思います。

51
Imran
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セクションで興味深いものを検索したので、私の回答を編集していますネイトのアイデアを裏付けるために。

20
inerte

標準の開発サーバーと本番環境を区別するために、settings.pyに次のコードを追加しました。

import sys
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')

ただし、これは規約にも依存しています。

(Daniel Magnussonのコメントに従って修正)

38

通常、environmentという変数を設定し、それを "DEVELOPMENT"、 "STAGING"、または "PRODUCTION"に設定します。設定ファイル内で、環境に基づいて、使用されている設定を変更するための基本的なロジックを追加できます。

編集:さらに、このロジックを使用して、基本設定を上書きするさまざまなsettings.pyファイルを含めることができます。例えば:

if environment == "DEBUG":
    from debugsettings import *
14
Soviut

通常これは動作します:

import sys

if 'runserver' in sys.argv:
    # you use runserver
9
Sven R. Kunze

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でサービスを提供しているので、ファイルパスをチェックすることは、環境変数を使用するよりもはるかに簡単でした。

6
utku_karatas

私はたった今この問題に遭遇し、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

これは機能しますが、最もエレガントなソリューションではないことを認識しています...

4

ランタイム環境に応じて設定ファイルを自動的に切り替える場合は、環境が異なるものを使用できます。

from os import environ
if environ.get('_', ''): 
    print "This is dev - not Apache mod_wsgi"         
4
Ed C

開発環境と配備環境の違いの1つは、それが実行されるサーバーです。正確に何が異なるかは、開発環境とデプロイメント環境によって異なります。

独自の開発環境と配備環境を知っている場合、HTTP要求変数を使用して2つを区別できます。 request.META.HTTP_Hostrequest.META.SERVER_NAMErequest.META.SERVER_PORTなどの リクエスト変数 を見て、2つの環境で比較します。

きっと、明らかに異なるものを見つけて、開発環境の検出に使用できるはずです。 settings.pyでテストを行い、他の場所で使用できる変数を設定します。

2
Nate

私が使う:

_DEV_SERVERS = [
    'mymachine.local',
]

DEVELOPMENT = platform.node() in DEV_SERVERS
_

これは、マシンの.node()が返すものに注意を払う必要があります。機密の開発情報を誤って公開しないように、デフォルトは非開発であることが重要です。

コンピュータを一意に識別するより複雑な方法 を調べることもできます。

2
Carl G

settings.DEBUGはTrueで、Apacheまたは他の非開発サーバーで実行されている可能性があります。それでも実行されます。私の知る限り、ランタイム環境には、pidを調べてOSのpidと比較するだけで、この情報が得られます。

2
hughdbrown

WSGI(mod_wsgi、gunicorn、ウェイトレスなど)で実行しているか、manage.py(runserver、test、migrateなど)で実行しているか、またはその他の何かを実行しているかどうかを判断できます。

import sys
WSGI = 'Django.core.wsgi' in sys.modules
1
OrangeDog

Aryehの回答に触発されて、私が自分で使用するために考案したトリックは、sys.argv[0]で管理スクリプトの名前を探すだけです。

USING_DEV_SERVER = "pulpdist/manage_site.py" in sys.argv[0]

(私の使用例は、テストサーバーの実行時にDjangoネイティブ認証を自動的に有効にすることです-Apacheで実行している場合、開発サーバー上でも、現在のプロジェクトのすべての認証はKerberos経由で処理されます)

1
ncoghlan

あなたはチェックすることができますrequest.META["SERVER_SOFTWARE"]値:

dev_servers = ["WSGIServer", "Werkzeug"]
if any(server in request.META["SERVER_SOFTWARE"] for server in dev_servers):
    print("is local")
0
mislavcimpersak