在我的Django设置中,我有以下内容:调试=操作系统环境[“调试值”]其中DEBUG_VALUE = False然而,Django在我这样做的时候继续显示完整的错误消息。如果我手动添加DEBUG = False,它会工作并显示500错误。由于某种原因,当我使用os.environ值时Django忽略了它。我已确认DEBUG_VALUE为False,但正在输出到文件。我甚至试过:调试= bool(操作系统环境[“调试值”])并且仍然显示完全错误。
DEBUG_VALUE = False
DEBUG = False
os.environ
DEBUG_VALUE
8xiog9wr1#
os.environ['DEBUG_VALUE']的值是一个字符串,并且bool('non empty string') == True。您应该执行类似于以下操作:
os.environ['DEBUG_VALUE']
bool('non empty string') == True
DEBUG = os.environ['DEBUG_VALUE'] == 'TRUE'
ev7lccsx2#
django-environ包有一种简单的方法来管理这个问题,我认为它比手动解析字符串值(它总是求值为true)更健壮、更优雅--您可以将您的环境作为对象导入。导出环境变量并安装软件包:
django-environ
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新手还是老手,它都是一个很好的项目起点。
svgewumm3#
也许你需要一些更宽容的东西。首先允许本地定义用于开发目的。只有在没有定义的情况下,才从环境变量中获取它,但是使用不区分大小写的比较(因为进行部署的人可能不是编写这行代码的开发人员)。
try: DEBUG = DEBUG_VALUE_LOCAL except NameError: DEBUG = os.environ.get('DEBUG_VALUE').lower() == 'true'
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))
0pizxfdo5#
另一个解决方案,在我看来,最好是使用distutils.util中的strtobool在python 3及更高版本中
distutils.util
strtobool
#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']))
cx6n0qe36#
我知道这是一个老职位,但这一直为我工作,当我使用一个.env与调试变量设置为0或1。
DEBUG = (bool(int(os.environ.get('DEBUG',1))))
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'
7条答案
按热度按时间8xiog9wr1#
os.environ['DEBUG_VALUE']
的值是一个字符串,并且bool('non empty string') == True
。您应该执行类似于以下操作:
ev7lccsx2#
django-environ
包有一种简单的方法来管理这个问题,我认为它比手动解析字符串值(它总是求值为true)更健壮、更优雅--您可以将您的环境作为对象导入。导出环境变量并安装软件包:
然后在django中,将环境导入为Env()对象,并使用bool()方法解析布尔值,并提供一个可选的默认值:
Tada!Env()对象还有很多其他的方法(例如解析整数、浮点数、字符串等)。
NB我在django-cookicutter应用程序中发现了这一点,它预装了一堆同样有用的东西,无论你是django新手还是老手,它都是一个很好的项目起点。
svgewumm3#
也许你需要一些更宽容的东西。首先允许本地定义用于开发目的。只有在没有定义的情况下,才从环境变量中获取它,但是使用不区分大小写的比较(因为进行部署的人可能不是编写这行代码的开发人员)。
chy5wohz4#
或者,如果对环境变量使用1/0值而不是True/False,则可以使用int(String)进行计算:
0pizxfdo5#
另一个解决方案,在我看来,最好是使用
distutils.util
中的strtobool
在python 3及更高版本中
cx6n0qe36#
我知道这是一个老职位,但这一直为我工作,当我使用一个.env与调试变量设置为0或1。
tuwxkamq7#
我确认由@aumo(DEBUG = os.environ ['DEBUG_VALUE']== 'TRUE')提供的方法工作正常,即使您需要在systemd init文件中传递参数,例如:
在设置文件中是这样的: