Как я могу быть уверенным, что мое приложение работает на сервере разработки или нет? Я предполагаю, что могу проверить значение settings.DEBUG
и предположить, что DEBUG
есть True
, затем он работает на сервере разработки, но я бы предпочел знать наверняка, чем полагаться на соглашение.
Как узнать, работает ли приложение Django на сервере разработки или нет?
Ответ 1
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
, поэтому я просто редактирую свой ответ, чтобы подтвердить с идеями Нейта.
Ответ 2
Я установил следующее в моих settings.py, чтобы различать стандартный сервер dev и production:
import sys
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
Это также зависит от соглашения.
(Изменен в отношении комментария Даниэля Магнуссона)
Ответ 3
Обычно я устанавливаю переменную под названием environment
и устанавливаю ее в "РАЗРАБОТКА", "СТАЖИРОВАНИЕ" или "ПРОИЗВОДСТВО". В файле настроек я могу добавить базовую логику, чтобы изменить, какие настройки используются на основе среды.
EDIT: Кроме того, вы можете просто использовать эту логику для включения различных файлов settings.py
, которые переопределяют базовые настройки. Например:
if environment == "DEBUG":
from debugsettings import *
Ответ 4
Обычно это работает:
import sys
if 'runserver' in sys.argv:
# you use runserver
Ответ 5
Опираясь на настройки .DEBUG - самый изящный способ AFAICS, так как он иногда используется в базе кода Django.
Я предполагаю, что вы действительно хотите, чтобы установить этот флаг автоматически, без необходимости его обновления вручную каждый раз, когда вы загружаете проект на производственные серверы.
Для этого я проверяю путь 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
Я столкнулся с этой проблемой только сейчас и в итоге написал решение, подобное Aryeh Leib Taurog's. Мое основное отличие состоит в том, что я хочу различать производственную среду и среду разработки при работе с сервером, но также при запуске некоторых одноразовых скриптов для моего приложения (которое я запускаю, как DJANGO_SETTINGS_MODULE = настройки python [ script]). В этом случае просто посмотреть, недостаточно ли argv [1] == runningerver. Так что я придумал, чтобы передать дополнительный аргумент командной строки при запуске 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 runningerver [любые параметры, которые вы хотите] - в разработке
и запуск моих скриптов так же просто, как
DJANGO_SETTINGS_MODULE = настройки python [myscript] --in-development
Просто убедитесь, что дополнительный аргумент, который вы проходите, не конфликтует ни с чем django (на самом деле я использую имя моего приложения как часть аргумента). Я думаю, что это довольно прилично, поскольку это позволяет мне точно контролировать, когда мой сервер и скрипты будут вести себя как prod или dev, и я не полагаюсь на другие соглашения, кроме моих собственных.
EDIT: manage.py жалуется, если вы передаете нераспознанные параметры, поэтому вам нужно изменить код в settings.py, чтобы быть чем-то вроде
if sys.argv[0] == 'manage.py' or '--in-development' in sys.argv:
# ...
pass
Хотя это работает, я признаю это не самым элегантным решением...
Ответ 7
Если вы хотите автоматически переключать свои файлы настроек в зависимости от среды выполнения вы можете просто использовать что-то, что отличается в среде, например.
from os import environ
if environ.get('_', ''):
print "This is dev - not Apache mod_wsgi"
Ответ 8
settings.DEBUG может быть True и работать под Apache или другим сервером, не являющимся разработчиком. Он все равно будет работать. Насколько я могу судить, во временной среде нет ничего, кроме изучения pid и сравнения с pids в ОС, которые предоставят вам эту информацию.
Ответ 9
Одно из отличий между средой разработки и развертывания - это сервер, на котором он работает. То, что конкретно отличается, будет зависеть от вашей среды разработки и развертывания.
Зная ваши собственные среды разработки и развертывания, переменные запроса HTTP могут использоваться для различения этих двух. Посмотрите запросить переменные, например request.META.HTTP_HOST
, request.META.SERVER_NAME
и request.META.SERVER_PORT
, и сравните их в двух средах.
Бьюсь об заклад, вы найдете что-то совершенно очевидное, которое отличается и может быть использовано для обнаружения вашей среды разработки. Проведите тест в settings.py
и установите переменную, которую вы можете использовать в другом месте.
Ответ 10
Я использую:
DEV_SERVERS = [
'mymachine.local',
]
DEVELOPMENT = platform.node() in DEV_SERVERS
который требует внимания к тому, что возвращается .node()
на ваших машинах. Важно, чтобы по умолчанию была неразработка, чтобы вы случайно не раскрывали конфиденциальную информацию о развитии.
Вы также можете изучить более сложные способы уникальной идентификации компьютеров.
Ответ 11
Вдохновленный Aryeh ответом, трюк, который я придумал для собственного использования, - это просто искать имя моего управления script в sys.argv[0]
:
USING_DEV_SERVER = "pulpdist/manage_site.py" in sys.argv[0]
(Моим вариантом использования является автоматическое включение подлинной аутентификации Django при запуске тестового сервера - при работе под Apache, даже на серверах разработки, вся аутентификация для моего текущего проекта обрабатывается через Kerberos)
Ответ 12
Вы можете определить, используете ли вы WSGI
(mod_wsgi, gunicorn, официантка и т.д.) Или manage.py
(runserver, test, migrate и т.д.) Или что-то еще:
import sys
WSGI = 'django.core.wsgi' in sys.modules
Ответ 13
Вы можете проверить значение request.META["SERVER_SOFTWARE"]
:
dev_servers = ["WSGIServer", "Werkzeug"]
if any(server in request.META["SERVER_SOFTWARE"] for server in dev_servers):
print("is local")