Django在我使用os.environ时忽略DEBUG值,为什么?

carvr3hs  于 2022-12-27  发布在  Go
关注(0)|答案(7)|浏览(158)

在我的Django设置中,我有以下内容:
调试=操作系统环境[“调试值”]
其中DEBUG_VALUE = False
然而,Django在我这样做的时候继续显示完整的错误消息。如果我手动添加DEBUG = False,它会工作并显示500错误。
由于某种原因,当我使用os.environ值时Django忽略了它。
我已确认DEBUG_VALUE为False,但正在输出到文件。
我甚至试过:
调试= bool(操作系统环境[“调试值”])
并且仍然显示完全错误。

8xiog9wr

8xiog9wr1#

os.environ['DEBUG_VALUE']的值是一个字符串,并且bool('non empty string') == True
您应该执行类似于以下操作:

DEBUG = os.environ['DEBUG_VALUE'] == 'TRUE'
ev7lccsx

ev7lccsx2#

django-environ包有一种简单的方法来管理这个问题,我认为它比手动解析字符串值(它总是求值为true)更健壮、更优雅--您可以将您的环境作为对象导入。
导出环境变量并安装软件包:

export MY_DEBUG_ENV_VAR=False
pip install django-environ

然后在django中,将环境导入为Env()对象,并使用bool()方法解析布尔值,并提供一个可选的默认值:

import environ
env = environ.Env()
MY_DEBUG_ENV_VAR = env.bool('MY_DEBUG_ENV_VAR', default=False)

Tada!Env()对象还有很多其他的方法(例如解析整数、浮点数、字符串等)。
NB我在django-cookicutter应用程序中发现了这一点,它预装了一堆同样有用的东西,无论你是django新手还是老手,它都是一个很好的项目起点。

svgewumm

svgewumm3#

也许你需要一些更宽容的东西。首先允许本地定义用于开发目的。只有在没有定义的情况下,才从环境变量中获取它,但是使用不区分大小写的比较(因为进行部署的人可能不是编写这行代码的开发人员)。

try:
    DEBUG = DEBUG_VALUE_LOCAL
except NameError:
    DEBUG = os.environ.get('DEBUG_VALUE').lower() == 'true'
chy5wohz

chy5wohz4#

或者,如果对环境变量使用1/0值而不是True/False,则可以使用int(String)进行计算:

# Set DEBUG flag. Default is 0 (considered as False in conditions)
DEBUG = int(os.environ.get('DEBUG_VALUE', 0))
0pizxfdo

0pizxfdo5#

另一个解决方案,在我看来,最好是使用distutils.util中的strtobool
在python 3及更高版本中

#import distutls 
# if you using python version > 3 use from distutils import strtobool
from distutils.util import strtobool 

_DEBUG = bool(strtobool(os.environ['DEBUG_MODE']))
cx6n0qe3

cx6n0qe36#

我知道这是一个老职位,但这一直为我工作,当我使用一个.env与调试变量设置为0或1。

DEBUG = (bool(int(os.environ.get('DEBUG',1))))
tuwxkamq

tuwxkamq7#

我确认由@aumo(DEBUG = os.environ ['DEBUG_VALUE']== 'TRUE')提供的方法工作正常,即使您需要在systemd init文件中传递参数,例如:

[Unit]
Description=Sample Application using Daphne
After=network.target

[Service]
Type=simple
Environment=DEBUG=False
Environment=LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/

User=root
WorkingDirectory=/var/projects/sampleapp/app
ExecStart=/var/projects/sampleapp/env/bin/daphne -b 0.0.0.0 -p 8000 app.asgi:application
Restart=always

[Install]
WantedBy=multi-user.target

在设置文件中是这样的:

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

相关问题