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

StackOverflow https://stackoverflow.com/questions/1291755

  •  18-09-2019
  •  | 
  •  

Вопрос

Как я могу быть уверен, что мое приложение работает на сервере разработки или нет?Полагаю, я мог бы проверить значение 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')

Однако это также зависит от конвенции.

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

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

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

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

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

import sys

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

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

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

РЕДАКТИРОВАТЬ: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"         

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

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

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

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

Я использую:

DEV_SERVERS = [
    'mymachine.local',
]

DEVELOPMENT = platform.node() in DEV_SERVERS

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

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

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

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

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

Вы можете определить, используете ли вы WSGI (mod_wsgi, пушка, официантка и т. д.) vs. manage.py (сервер запуска, тестирование, миграция и т. д.) или что-нибудь еще:

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

Вы могли бы проверить request.META["SERVER_SOFTWARE"] ценить:

dev_servers = ["WSGIServer", "Werkzeug"]
if any(server in request.META["SERVER_SOFTWARE"] for server in dev_servers):
    print("is local")
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top