2011-09-03 83 views
12

是否有一种简单的方法可以告诉Django的runserver覆盖settings.py文件中的单个变量?Django:Override Debug = True from manage.py runserver命令

我希望能够调用:

python manage.py runserver 0.0.0.0:8000 Debug=False 

有什么想法?

动机:有一个特定的网站,其中有数百个数据库查询来显示或保存特定页面,我希望能够快速关闭调试,而无需编辑我的设置文件(它有可能被遗忘)。

回答

15

我认为你有两个选择

最简单的可能是一个自定义的设置覆盖,是这样的:

# 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。如果您在导入和调用之间添加了一些代码,则可以检查额外的参数并根据需要更改设置。这有点烦琐,容易中断/被遗忘,所以我建议覆盖设置包装可能是你最好的选择。

+0

这足够接近单个命令,谢谢! – Ted

+1

'DJANGO_SETTINGS_MODULE' env var可用于指定特定设置文件的环境。 – ThorSummoner

5

我编辑我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:只要你是一致的,你可以随意命名变量什么代码)

更新:一个评论者指出,当DEBUGTrueALLOWED_HOSTS指令被忽略。这只适用于旧版本的Django。如果当DEBUG启用时未指定,则当前行为是表彰ALLOWED_HOSTS或默认为本地主机地址。我的答案已更新,以反映这是一个小小的更正。

这是从Django documentation来源:

当DEBUG为True,并且ALLOWED_HOSTS是空的,所述宿主是 针对[ '本地主机', '127.0.0.1' 验证, '[:: 1]' ]

此外,它指出,在现在的几个主要版本线过时您的评论的行为:

在旧版本中,ALLOWED_HOST如果DEBUG = True,则不检查S。 Django 1.10.3,1.9.11和1.8.16中的这一点也发生了变化,以防止发生DNS重绑定攻击 。

+0

当DEBUG开启时,'ALLOWED_HOSTS'被忽略。如果您只想从本地主机访问,最简单的控制方法是使用'runserver'命令行设置绑定哪个接口。 – rescdsk

+1

只适用于Django的*旧版本。请看我更新的答案。 – DamnedFacts

相关问题