Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django检查和备用Docker编写文件:未设置调试标志?_Python_Django_Docker_Docker Compose - Fatal编程技术网

Python Django检查和备用Docker编写文件:未设置调试标志?

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

我正在准备一份Django的生产申请。我创建了一个备用docker compose YML文件,其中指定DEBUG=0。但是,当我运行django部署检查时,它会说DEBUG设置为True

有没有想过我会错在哪里?我认为这是我使用Docker的问题。但这可能是我如何使用Django的问题吗

以下是我的步骤:

  • 使用docker-compose.yml创建我的项目(见下文)
  • 为生产创建docker-compose-prod.yml(见下文)
  • 运行以下命令
  • 检查的输出:
    ?:(security.W018)在部署中不应将DEBUG设置为True。
  • 到目前为止的一些调查步骤:

    A.检查环境变量

    $ docker-compose exec web python
    >>> import os
    >>> os.environ.get('DEBUG')
    '0'
    
    B.尝试以不同的方式重建docker映像,例如使用--no cache标志

    C.在条件代码块的settings.py中设置调试标志(而不是使用os.environ.get)。这似乎奏效了。但我不明白为什么?代码详细信息如下

    代码摘录

  • 摘自docker-compose.yml
  • 摘自docker-compose-prod.yml
  • settings.py的摘录

  • 环境变量是字符串,因此
    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]