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

时间:2016-07-27 15:15:29

标签: django

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

我不相信我以前见过这个,但是将debug设置为false并没有摆脱我项目的调试模式。这意味着当有500个错误时它会显示错误,而404错误会显示我的所有网址。

奇怪的是,当我登录服务器并运行从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()

10 个答案:

答案 0 :(得分:2)

这最终成为一个问题,配置变量为" False"而不是False,因此debug没有正确设置为布尔值。感谢@WithNail帮助我们找到答案

答案 1 :(得分:2)

作为对他人的说明:我遇到了同样的问题;我按照the digital ocean documentation的ubuntu 16.04教程,在一台带有gunicorn和nginx的虚拟机上配置了我的生产网站。

即使重新启动nginx systemd的服务,我也无法关闭调试模式:解决方案是重启gunicorn服务:

# systemctl restart nginx gunicorn

答案 2 :(得分:1)

如果有人对环境变量使用python-decouple并在调试时遇到问题,则必须使用此行来检索布尔值:

from decouple import config
DEBUG = config('DEBUG', default=False, cast=bool)

答案 3 :(得分:0)

我会把这作为后来人们的实际答案。

这可能会发生三个主要方面,其中“这个”基本上是:

  

我在设置中更改了某些内容,但似乎没有反映在我的应用操作中!

  1. 代码更改后,服务器尚未重置。
  2. 本地和开发设置未被覆盖/或以意外方式覆盖
  3. 本地环境变量正在覆盖硬编码的尝试
  4. 在Heroku上,如本例所示,环境变量are set this way.Linux enviroments is available here.中使用它们的更一般指南

    使用问题中的示例,您可以看到正在使用的环境变量:

    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

    在这种情况下,最好不要设置环境变量,而不是类型转换,as per this related answer.

答案 4 :(得分:0)

问题的根本原因-False转换为'False'字符串而不是布尔值。

使用的下一个解决方案( settings.py ):

DEBUG = os.getenv('DEBUG', False) == 'True'

i.e .:在这种情况下,仅当env时,DEBUG才会设置为(bool)True。变量明确设置为True或“ True”值。

祝您好运! :)

答案 5 :(得分:0)

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

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

要解决此问题,我在产品设置文件中硬编码了DEBUG = False

答案 6 :(得分:0)

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中的问题,请不要为config var设置任何值。它将返回null字符串,并且在类型转换后将返回False: enter image description here

答案 7 :(得分:0)

使用模块decouplepip install python-decouple)时,请确保将DEBUG转换为布尔值。因此settings.py应该具有以下行:

from decouple import config

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

.env文件中的位置

DEBUG = False # or True

答案 8 :(得分:0)

我遇到了同样的错误,即 OTREE_PRODUCTION=1 在 Heroku 上给出了错误 500。我所做的是制作一个新应用程序(注意更改 Heroku 堆栈以使其与您的 Python 版本兼容),将代码上传到这个新应用程序,并为这个新应用程序设置 OTREE_PRODUCTION=1。

答案 9 :(得分:-1)

万一有人使用 .env 文件或加载环境变量,我使用以下方法以正确的类型有效加载DEBUG env变量:

import os

APP_DEGUB_MODE = os.getenv('APP_DEBUG', False)
DEBUG = eval(APP_DEGUB_MODE) if isinstance(APP_DEGUB_MODE, str) else APP_DEGUB_MODE