Django中DEBUG=False仍在调试模式下运行

17

我在我的部署服务器(heroku上)上设置DEBUG = False时出现了问题。

我以前从未遇到过这种情况,但将调试设置为false并没有摆脱项目的调试模式。这意味着当有500错误时,它会显示错误,并且404错误显示所有我的URL。

奇怪的是,当我登录服务器并从中获取设置值时,django.conf import settings settings.DEBUG显示为False,这是我为生产服务器设置的内容。TEMPLATE_DEBUG也设置为False。

我不知道我是否曾看到过这种情况,即DEBUG = False但仍处于调试模式。有什么想法吗?

编辑:

我想补充一下,因为人们在将调试关闭为False时经常会遇到500或400错误。我没有遇到任何错误,我的项目只是像在DEBUG模式下一样运行。

# settings/dev.py
from .base import *

DEBUG = True
TEMPLATE_DEBUG = DEBUG

if not DEBUG:
    ALLOWED_HOSTS = ['localhost']

SECRET_KEY = 'localsecret1234123412341234'


# settings/prod.py
from .base import *

import dj_database_url, os

DEBUG = os.environ.get("DEBUG", False)
TEMPLATE_DEBUG = DEBUG

ALLOWED_HOSTS = ['mydomain.com']
SECRET_KEY = os.environ["DJANGO_SECRET_KEY"]

STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

DATABASES = {}
DATABASES['default'] =  dj_database_url.config()

你可能希望提供完整的settings.py文件(减去任何机密信息);此外,提供一步一步的说明,如何将DEBUG设置为false并尝试使其生效。 - Jerry Stratton
你是否正在运行本地和生产设置文件?有几件事情需要注意-首先,您需要提供您的设置文件,并且在更改DEBUG后是否已重置?根据您在Heroku上的配置,它可能不会自动重置任何正在服务于Django应用程序的内容。最后,是否使用了任何环境变量?这可能会覆盖您的设置文件绑定。 - Withnail
@JerryStratton 我在活动的设置文件中设置了 DEBUG=False,然后在 manage.py shell 中验证它是否实际上被设置为 False。还要访问一个我知道会返回 404 的页面,并查看它是否返回我的 404.html 模板或显示所有的 URL。 - awwester
@Withnail 我尝试手动使用 heroku restart 重新启动,但是出现了相同的行为。 - awwester
嗯,看起来都没问题 - 如果你从heroko(而不是django)shell运行printenv,会有关于你的DEBUG设置的参考吗?我仍然觉得这里可能涉及到一个环境变量。 - Withnail
显示剩余4条评论
10个回答

29
问题的根本原因是将数据类型为布尔值的 False 转化为字符串 'False'。下面是解决方案(settings.py 文件中代码):
DEBUG = os.getenv('DEBUG', False) == 'True'
e.g.:在这种情况下,只有当环境变量明确设置为True'True'时,DEBUG将被设置为(布尔值)True

祝您配置成功! :)

从环境中读取DEBUG值为字符串,正如Daniel在他的回答中所写,你的环境变量值为'False',而不是布尔类型的False。值得再次确认一下,我认为。 - metinsenturk
在Kubernetes的configmap中运行得非常好。 - sincorchetes
1
正确的答案,尝试了互联网上的所有修复方法都没有起作用,这个解释是非常必要的。谢谢你。 - Bharath
@Bharath 不用谢!我很高兴我的回答能帮到你! - Taraskin
对于任何使用 conf.json 文件的人,语法是 DEBUG = config['DEBUG'] == "True" - Jakub Holan

9
作为对其他人的提示:我遇到了同样的问题;我在使用gunicorn和nginx创建我的生产网站时,按照Digital Ocean文档中针对Ubuntu 16.04的教程进行配置。
即使重启了nginx systemd服务,我也无法关闭调试模式:解决方法是也要重启gunicorn服务。
# systemctl restart nginx gunicorn

6
如果有人正在使用“python-decouple”进行环境变量操作,并在处理DEBUG时遇到问题,则必须使用以下代码行来检索布尔值:
from decouple import config
DEBUG = config('DEBUG', default=False, cast=bool)

谢谢@jturi,这终于解决了我的问题 :-) - Simon

4
这实际上是一个配置变量问题,它的值是“False”,而不是False。因此,调试模式没有被正确地设置为布尔值。感谢@WithNail帮助找到答案。

4
我将把这作为实际答案提供给后来的人。这里有三个主要的区域可以发生这种情况,其中“这”基本上是指:

我已经更改了设置,但似乎没有反映在我的应用程序中!

  1. 服务器在代码更改后未被重置。
  2. 本地和Dev设置没有覆盖或以意想不到的方式覆盖。
  3. 本地环境变量正在覆盖尝试硬编码它的操作。
在Heroku等平台上,环境变量是通过这种方式设置的。可以在此处找到有关在Linux环境中使用环境变量的更一般指南。
使用问题中的示例,您可以看到在哪里使用了环境变量:
SECRET_KEY = os.environ["DJANGO_SECRET_KEY"] 

使用os库来访问系统,并检查名为DJANGO_SECRET_KEY的环境变量。

更好的例子是:

DEBUG = os.environ.get("DEBUG", False)

这很好,因为它尝试从环境中获取它,如果失败,则将元组中的第二个值用作默认值:在本例中为False。

在调试过程中,您可以使用linux shell中的printenv查找设置,它会打印出所有可用的EnvVars。 如果它们不存在,则可以按以下格式设置它们:

export DJANGO_SETTINGS_MODULE=mysite.settings

在这种情况下,最好取消设置环境变量,而不是进行类型转换,如相关答案所述。


3

DEBUG需要布尔值。

os.environ.get("DEBUG", False)返回字符串值。

所有的字符串值在类型转换时都会返回True。 这就是为什么DEBUG是True的原因。

 print(bool(os.environ.get("DEBUG", False))) # output: True
 print(bool("False"))  # output: True
 print(bool(""))  # output: False

为解决Heroku上的问题,请不要为配置变量设置任何值。它将返回空字符串,并在类型转换后返回False: enter image description here

2
当您使用模块decouple(pip install python-decouple)时,请确保将DEBUG强制转换为bool值。因此,settings.py应该有以下行:
from decouple import config

DEBUG = config('DEBUG', default=False, cast=bool)

.env文件中的位置

DEBUG = False # or True

1

我也遇到了这个问题,因为我从一个环境变量中加载了调试设置DEBUG = os.environ.get('DEBUG_MODE'))

这将DEBUG值设置为字符串,而不是布尔值。

为了解决这个问题,在我的生产设置文件中硬编码了DEBUG = False


0

我遇到了同样的问题,但是没有任何解决方案可行。我的错误源于服务器配置。我有多个应用程序由NGINX和GUNICORN提供服务。其中一个应用程序与默认服务器链接。

这意味着任何不匹配IP:端口监听对服务器块的请求都将由默认服务器提供服务。在调试时,我偶然将与默认服务器块链接的应用程序的settings.py设置为DEBUG=True,并忘记将其设置回DEBUG=False

因此,将默认应用程序的服务器块的settings.py设置回DEBUG=False,问题得以解决。


0

我遇到了与OTREE_PRODUCTION=1在Heroku上出现500错误的相同问题。我的解决方法是创建一个新的应用程序(请注意更改Heroku堆栈以使其与您的Python版本兼容),将代码上传到这个新的应用程序,并为此新的应用程序设置OTREE_PRODUCTION=1。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接