Как я могу узнать, запущено ли мое приложение Django на сервере разработки или нет?

Как я могу быть уверен, что мое приложение работает на сервере разработки или нет? Я полагаю, я мог проверить значение settings.DEBUG и предположим, если DEBUG является True тогда он работает на сервере разработки, но я бы предпочел знать наверняка, чем полагаться на соглашение.

16 ответов

Решение
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')

Это также зависит от соглашения, однако.

(Изменено согласно комментарию Дэниела Магнуссона)

Обычно это работает:

import sys

if 'runserver' in sys.argv:
    # you use runserver

Обычно я устанавливаю переменную с именем environment и установите его в "РАЗРАБОТКА", "СТАДИЯ" или "ПРОИЗВОДСТВО". Затем в файле настроек я могу добавить базовую логику, чтобы изменить используемые настройки в зависимости от среды.

РЕДАКТИРОВАТЬ: Кроме того, вы можете просто использовать эту логику для включения различных settings.py файлы, которые переопределяют базовые настройки. Например:

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

Опираясь на настройки.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, проверять пути к файлам было проще, чем работать с переменными окружения.

Вы можете определить, работаете ли вы под WSGI (mod_wsgi, gunicorn, официантка и т. д.) против manage.py (runserver, test, migrate и т. д.) или что-либо еще:

import sys
WSGI = 'django.core.wsgi' in sys.modules

Я только что столкнулся с этой проблемой и закончил тем, что написал решение, подобное Арье Лейбу Таурогу. Мое основное отличие заключается в том, что я хочу различать производственную среду и среду разработки при запуске сервера, а также при запуске некоторых одноразовых сценариев для моего приложения (которые я запускаю как 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 [любые опции, которые вы хотите] - в разработке

и запускать мои скрипты так же просто, как

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

Хотя это работает, я понимаю, что это не самое элегантное решение...

Если вы хотите автоматически переключать файлы настроек в зависимости от среды выполнения, вы можете просто использовать что-то, что отличается от среды, например

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

Одним из различий между средой разработки и развертывания будет сервер, на котором он работает. Что именно отличается, будет зависеть от вашей среды разработки и развертывания.

Зная свои собственные среды разработки и развертывания, можно использовать переменные HTTP-запроса, чтобы различать их. Посмотрите на переменные запроса как request.META.HTTP_HOST, request.META.SERVER_NAME а также request.META.SERVER_PORT и сравнить их в двух средах.

Могу поспорить, вы найдете что-то совершенно очевидное, другое, и его можно использовать для обнаружения вашей среды разработки. Сделать тест в settings.py и установите переменную, которую вы можете использовать в другом месте.

settings.DEBUG может иметь значение True и работать под Apache или другим сервером, не предназначенным для разработки. Это все еще будет работать. Насколько я могу судить, в среде выполнения нет ничего, кроме проверки pid и сравнения с pids в ОС, которая даст вам эту информацию.

Я использую:

DEV_SERVERS = [
    'mymachine.local',
]

DEVELOPMENT = platform.node() in DEV_SERVERS

что требует внимания к тому, что возвращает .node() на ваших машинах. Важно, чтобы по умолчанию не было разработки, чтобы случайно не раскрыть конфиденциальную информацию о разработке.

Вы также можете изучить более сложные способы уникальной идентификации компьютеров.

Просто вы можете проверить путь, по которому вы работаете на сервере. Что-то вроде:

      import os
SERVER = True if os.path.exists('/var/www/your_project') else False

Вы можете проверить request.META["SERVER_SOFTWARE"] значение:

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

Вдохновленный ответом Арье, уловка, которую я разработал для собственного использования, заключается в том, чтобы просто искать название моего сценария управления в sys.argv[0]:

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

(Мой вариант использования заключается в том, чтобы автоматически включить собственную аутентификацию Django при запуске тестового сервера - при работе под Apache, даже на серверах разработки, вся аутентификация для моего текущего проекта обрабатывается через Kerberos)

Один из подходов — создать переменную среды на вашем компьютере разработчика, напримерRUNNING_IN_DEVELOPMENT = 1. Например, JetBrains позволяет сделать это в диалоговом окне конфигурации.

Затем в settings.py вы можете сделать:

      try:
    running_in_development = os.getenv('RUNNING_IN_DEVELOPMENT')
    DEBUG = True if running_in_development else False
except Exception as e:
    DEBUG = False

Я использую следующее:

      MANAGING = (
    len(sys.argv) >= 2 and "manage.py" in sys.argv[0] and sys.argv[1] != "runserver"
)
Другие вопросы по тегам