Python Django检查和备用Docker编写文件:未设置调试标志?
我正在准备一份Django的生产申请。我创建了一个备用docker compose YML文件,其中指定DEBUG=0。但是,当我运行django部署检查时,它会说DEBUG设置为True 有没有想过我会错在哪里?我认为这是我使用Docker的问题。但这可能是我如何使用Django的问题吗 以下是我的步骤:Python Django检查和备用Docker编写文件:未设置调试标志?,python,django,docker,docker-compose,Python,Django,Docker,Docker Compose,我正在准备一份Django的生产申请。我创建了一个备用docker compose YML文件,其中指定DEBUG=0。但是,当我运行django部署检查时,它会说DEBUG设置为True 有没有想过我会错在哪里?我认为这是我使用Docker的问题。但这可能是我如何使用Django的问题吗 以下是我的步骤: 使用docker-compose.yml创建我的项目(见下文) 为生产创建docker-compose-prod.yml(见下文) 运行以下命令 检查的输出: ?:(security.W01
?:(security.W018)在部署中不应将DEBUG设置为True。
$ docker-compose exec web python
>>> import os
>>> os.environ.get('DEBUG')
'0'
B.尝试以不同的方式重建docker映像,例如使用--no cache标志
C.在条件代码块的settings.py中设置调试标志(而不是使用os.environ.get)。这似乎奏效了。但我不明白为什么?代码详细信息如下
代码摘录
环境变量是字符串,因此
os.environ.get()
的结果是字符串
若代码期望变量是int、boolean等,而不是字符串优先,那个么它可能会失败。或者,尝试转换为所需类型,该类型可能与所需结果不同
也就是说,如果转换为布尔值,则只有空字符串会导致False
因此,可能的选择是:
- 添加逻辑,首先读取环境变量,然后将其正确转换或解析为目标参数
- 使用env助手,比如,它允许自动将env变量转换为taget类型,并提供有用的实用工具方法,通常提供您可能在选项1中自己实现的东西
- 使用不同的模式传递参数-即不是通过env vars传递,而是通过自定义设置文件传递(也有相应的帮助程序)。有人更喜欢env变量,有人更喜欢文件,这也可能取决于项目/团队/部署方式(仪器支持什么)
os.environ.get()
的结果是字符串
若代码期望变量是int、boolean等,而不是字符串优先,那个么它可能会失败。或者,尝试转换为所需类型,该类型可能与所需结果不同
也就是说,如果转换为布尔值,则只有空字符串会导致False
因此,可能的选择是:
- 添加逻辑,首先读取环境变量,然后将其正确转换或解析为目标参数
- 使用env助手,比如,它允许自动将env变量转换为taget类型,并提供有用的实用工具方法,通常提供您可能在选项1中自己实现的东西
- 使用不同的模式传递参数-即不是通过env vars传递,而是通过自定义设置文件传递(也有相应的帮助程序)。有人更喜欢env变量,有人更喜欢文件,这也可能取决于项目/团队/部署方式(仪器支持什么)
False
,而不是0
。请将其设置为False
,而不是0
。谢谢。我没有考虑过类型!也谢谢你给我指点一些环境助手。我将来可能会实施这些措施。现在,我只是用这段代码来替换settings.py:if os.environ.get('DEBUG',default=0).lower()中的调试行,位于['true','1']:DEBUG=true,否则:DEBUG=False
谢谢。我没有考虑过类型!也谢谢你给我指点一些环境助手。我将来可能会实施这些措施。现在,我只是用这段代码替换settings.py:if os.environ.get('DEBUG',default=0).lower()中的调试行,在['true','1']:DEBUG=true,否则:DEBUG=False
$ docker-compose exec web python
>>> import os
>>> os.environ.get('DEBUG')
'0'
services:
web:
...
environment:
- ENVIRONMENT=development
- SECRET_KEY=randomlongseriesofchars
- DEBUG=1
services:
web:
...
environment:
- ENVIRONMENT=production
- SECRET_KEY=anotherrandomlongseriesofchars
- DEBUG=0
ENVIRONMENT = os.environ.get('ENVIRONMENT', default='production')
SECRET_KEY = os.environ.get('SECRET_KEY')
DEBUG = os.environ.get('DEBUG', default=0) #How is DEBUG being set to True?
...
if ENVIRONMENT == 'production':
[Various settings for production]
[Putting DEBUG=0 in this conditional block works]