Django:从manage.py runserver命令覆盖Debug = True

Ted*_*Ted 14 django

有没有一种简单的方法可以告诉Django runserver覆盖settings.py文件中的单个变量?

我很乐意打电话给:

python manage.py runserver 0.0.0.0:8000 Debug=False
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

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

Gag*_*arr 19

我认为你有两种选择

最简单的可能是自定义设置覆盖,类似于:

# no_debug_settings.py

# pull in the normal settings
from settings import *

# no debug for us
DEBUG = False
Run Code Online (Sandbox Code Playgroud)

现在,当你想在没有调试的情况下启动时,你将运行:

python manage.py runserver --settings=no_debug_settings 0.0.0.0:8000 
Run Code Online (Sandbox Code Playgroud)

作为替代方案,您可以自定义您的manage.py文件.导入设置,并将其传递给execute_manager.如果您在导入和调用之间添加了一些代码,则可以检查其他参数并根据需要更改设置.它更加繁琐,容易被打破/被遗忘,所以我建议覆盖设置包装器可能是你最好的方法.

  • `DJANGO_SETTINGS_MODULE` env var可用于将环境指向特定的设置文件。 (2认同)

Dam*_*cts 7

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 = ["*"]
Run Code Online (Sandbox Code Playgroud)

然后,通过传递环境变量来运行您的服务器DJANGO_DEBUG=1.只要您保持一致,就可以将变量命名为任何名称:

DJANGO_DEBUG=1 python -Wall manage.py runserver
Run Code Online (Sandbox Code Playgroud)

在调用manage.py禁用调试时省略该环境变量(因为将其设置为任何值,包括0仍将使其适用于Python代码.)

更新:一位意见提供者声明该ALLOWED_HOSTS指令在被忽略时DEBUG被忽略True.这仅适用于旧版本的Django.ALLOWED_HOSTS如果DEBUG启用时未指定,则当前行为是为了遵守或默认为localhost地址.我的答案已更新,以反映这是一个小的修正.

这来自Django文档:

当DEBUG为True且ALLOWED_HOSTS为空时,主机将针对['localhost','127.0.0.1','[:: 1]']进行验证

此外,它表明您的评论行为现在已在几个主要版本行中过时:

在旧版本中,如果DEBUG = True,则不检查ALLOWED_HOSTS.在Django 1.10.3,1.9.11和1.8.16中也改变了这一点,以防止DNS重新绑定攻击.