Django: Override Debug = True из команды manage.py runserver - PullRequest
14 голосов
/ 04 сентября 2011

Есть ли простой способ заставить Джанго runserver переопределить одну переменную в файле settings.py?

Мне бы хотелось иметь возможность вызывать:

python manage.py runserver 0.0.0.0:8000 Debug=False

Есть мысли?

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

Ответы [ 2 ]

18 голосов
/ 04 сентября 2011

Я думаю, у вас есть два варианта

Самым простым является, вероятно, переопределение пользовательских настроек, что-то вроде:

# no_debug_settings.py

# pull in the normal settings
from settings import *

# no debug for us
DEBUG = False

Теперь, когда вы хотите запустить без отладки, вы должны запустить:

python manage.py runserver --settings=no_debug_settings 0.0.0.0:8000 

В качестве альтернативы вы можете просто настроить файл manage.py. Это импортирует настройки и передает их execute_manager. Если вы добавили некоторый код между импортом и вызовом, вы можете проверить его на наличие дополнительных аргументов и при необходимости изменить настройки. Это немного сложнее и склонно ломаться / быть забытым, поэтому я бы посоветовал вам использовать упаковщик настроек переопределения.

7 голосов
/ 06 октября 2016

Я отредактировал мой settings.py файл с помощью условного блока, например:

import os  # If needed.

if os.environ.get('DJANGO_DEBUG'):
    print("Debug is enabled.")
    DEBUG = True
    # When not specified, ALLOW_HOSTS defaults to:
    # ALLOWED_HOSTS = ['localhost', '127.0.0.1', '[::1]']
else:
    DEBUG = False
    ALLOWED_HOSTS = ["*"]

Затем запустите сервер, передав переменную окружения DJANGO_DEBUG=1. Вы можете назвать переменную как угодно, если вы согласны:

DJANGO_DEBUG=1 python -Wall manage.py runserver

Пропустить эту переменную окружения при вызове manage.py, чтобы отключить отладку (потому что установка ее на любое значение, включая 0 все равно сделает ее верной коду Python.)

Обновление: Автор комментария заявил, что директива ALLOWED_HOSTS игнорируется, когда DEBUG равен True. Это верно только в старых версиях Django. Текущее поведение должно учитывать ALLOWED_HOSTS или значение по умолчанию для адресов локального хоста, если оно не указано, когда включен DEBUG. Мой ответ обновлен, чтобы отразить это как незначительное исправление.

Источник из документации Django :

Когда DEBUG равен True, а ALLOWED_HOSTS пусто, хост проверено на ['localhost', '127.0.0.1', '[:: 1]']

Кроме того, в нем говорится, что поведение вашего комментария устарело в нескольких основных строках:

В старых версиях ALLOWED_HOSTS не проверялось, если DEBUG = True. Это также было изменено в Django 1.10.3, 1.9.11 и 1.8.16, чтобы предотвратить Атака повторного связывания DNS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...