我在部署的服务器上设置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()
答案 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)
我会把这作为后来人们的实际答案。
这可能会发生三个主要方面,其中“这个”基本上是:
我在设置中更改了某些内容,但似乎没有反映在我的应用操作中!
在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:
答案 7 :(得分:0)
使用模块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 :(得分: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