アプリケーションが開発サーバーで実行されているかどうかを確認するにはどうすればよいですか? の値を確認して、開発サーバーで実行されているsettings.DEBUG
かどうかを推測できると思いますが、慣習に頼るよりも確実に知りたいと思います。DEBUG
True
13 に答える
標準の開発サーバーと本番環境を区別するために、settings.py に次のコードを追加しました。
import sys
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
ただし、これも規則に依存します。
(Daniel Magnusson のコメントに従って修正)
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
セクションで興味深いものを検索したので、ネイトのアイデアを裏付けるために回答を編集しています.
通常、これは機能します:
import sys
if 'runserver' in sys.argv:
# you use runserver
通常、変数という名前environment
を設定し、それを「DEVELOPMENT」、「STAGING」、または「PRODUCTION」に設定します。次に、設定ファイル内に、環境に基づいて使用される設定を変更するための基本的なロジックを追加できます。
編集:さらに、このロジックを使用してsettings.py
、基本設定をオーバーライドするさまざまなファイルを含めることができます。例えば:
if environment == "DEBUG":
from debugsettings import *
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 でサービスを提供している人にとって、ファイル パスのチェックは、環境変数を使用するよりも簡単でした。
ランタイム環境に応じて設定ファイルを自動的に切り替えたい場合は、環境が異なるものを使用できます。
from os import environ
if environ.get('_', ''):
print "This is dev - not Apache mod_wsgi"
私はちょうど今この問題に遭遇し、Aryeh Leib Taurog のような解決策を書くことになりました。私の主な違いは、サーバーを実行するときに本番環境と開発環境を区別したいということですが、アプリの 1 回限りのスクリプトを実行するときも同様です (これは 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=設定 python [myscript] --開発中
渡す追加の引数が django と競合しないことを確認してください (実際には、アプリの名前を引数の一部として使用しています)。サーバーとスクリプトがいつ prod または dev として動作するかを正確に制御できるため、これはかなりまともだと思います。また、自分以外の慣習に依存していません。
編集:認識されないオプションを渡すとmanage.pyが文句を言うので、settings.pyのコードを次のように変更する必要があります
if sys.argv[0] == 'manage.py' or '--in-development' in sys.argv:
# ...
pass
これは機能しますが、最もエレガントなソリューションではないことを認識しています...
WSGI
(mod_wsgi、gunicorn、waitress など) とmanage.py
(runserver、test、migrate など) で実行しているか、それ以外で実行しているかを判断できます。
import sys
WSGI = 'django.core.wsgi' in sys.modules
私が使う:
DEV_SERVERS = [
'mymachine.local',
]
DEVELOPMENT = platform.node() in DEV_SERVERS
マシン上で返されるものに注意を払う必要があり.node()
ます。機密性の高い開発情報を誤って公開しないように、デフォルトを非開発にすることが重要です。
また、コンピューターを一意に識別するためのより複雑な方法を調べることもできます。
settings.DEBUG は True で、Apache またはその他の非開発サーバーで実行されている可能性があります。それはまだ実行されます。私が知る限り、ランタイム環境には、pid を調べて OS の pid と比較する以外に、この情報を提供するものはありません。
One difference between the development and deployment environment is going to be the server that it’s running on. What exactly is different will depend on your dev and deployment environments.
Knowing your own dev and deploy environments, the HTTP request variables could be used to distinguish between the two. Look at request variables like request.META.HTTP_HOST
, request.META.SERVER_NAME
and request.META.SERVER_PORT
and compare them in the two environments.
I bet you’ll find something quite obvious that’s different and can be used to detect your development environment. Do the test in settings.py
and set a variable that you can use elsewhere.
Aryeh の答えに触発されて、私が自分で使用するために考案したトリックは、管理スクリプトの名前を次の場所で探すことですsys.argv[0]
。
USING_DEV_SERVER = "pulpdist/manage_site.py" in sys.argv[0]
(私の使用例は、テスト サーバーの実行時に Django ネイティブ認証を自動的に有効にすることです。開発サーバー上であっても、Apache で実行する場合、現在のプロジェクトのすべての認証は Kerberos を介して処理されます)