【问题标题】:django DEBUG=False still runs in debug modedjango DEBUG=False 仍然在调试模式下运行
【发布时间】:2016-07-27 15:15:28
【问题描述】:

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

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

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

我不知道我以前在哪里见过DEBUG = False,但它仍在调试模式下运行。有什么想法吗?

编辑:

我想我也会写这个小注释,因为人们在将调试切换为 False 时遇到 500 或 400 个错误是很常见的。我没有收到任何错误,我的项目就像处于调试模式一样。

# 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 并尝试使其生效的分步说明。
  • 您是否正在运行本地和生产设置文件?有几件事——首先你需要提供你的设置文件——一旦你对调试进行了更改,你有没有重置?根据您在 Heroku 上的配置,它可能不会自动重置为 Django 应用程序提供服务的任何内容。最后,是否使用了任何环境变量?这可能会覆盖您的设置文件绑定。
  • 添加了开发/产品设置。据我所知,heroku 正在重置。我不知道每次我上传任何更改它们都会生效。如果您需要查看完整的 settings/base.py,请告诉我,但问题是当我进入 ./manage.py shell 时,它显示 debug 为 False。
  • @JerryStratton 我在活动设置文件中设置了DEBUG=False,然后在 manage.py shell 中验证它是否实际设置为 False。还转到我知道返回 404 的页面并查看它是否返回我的 404.html 模板或显示所有网址
  • @Withnail 我尝试使用 heroku restart 手动重启,但行为相同

标签: django


【解决方案1】:

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

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

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

即:在这种情况下,DEBUG 将设置为 (bool) True,仅当环境变量显式设置为 True'True'

祝你配置成功! :)

【讨论】:

  • 从环境中,您将 DEBUG 值读取为字符串,正如丹尼尔在他的回答中所写,您的环境变量的值是 'False',它不是布尔类型 False。我认为值得仔细检查。
  • 在 Kubernetes 的 configmap 中效果很好。
【解决方案2】:

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

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

# systemctl restart nginx gunicorn

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 谢谢@jturi,这终于解决了我的问题:-)
    【解决方案4】:

    我会将此作为后来者的实际答案。

    这可能发生在三个主要领域,“this”基本上是:

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

    1. 更改代码后服务器尚未重置。
    2. 本地和开发设置尚未覆盖/或以意外方式覆盖
    3. 本地环境变量覆盖了硬编码尝试

    在 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 查找您的设置,这将打印出所有可用的 EnvVar。如果它们不存在,您可以将它们设置为以下格式:

    export DJANGO_SETTINGS_MODULE=mysite.settings

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

    【讨论】:

      【解决方案5】:

      这最终成为配置变量为“False”而不是False 的问题,因此调试未正确设置为布尔值。向@WithNail 大喊帮助我们找到答案

      【讨论】:

        【解决方案6】:

        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 设置任何值。它将返回空字符串,在类型转换后它将返回 False:

        【讨论】:

          【解决方案7】:

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

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

          .env 文件中的位置

          DEBUG = False # or True
          

          【讨论】:

            【解决方案8】:

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

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

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

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

                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
                
                

                【讨论】:

                  猜你喜欢
                  • 2023-03-22
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-01-08
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-07-09
                  相关资源
                  最近更新 更多