Django 环境变量不起作用

LeL*_*uch 0 django

我在 gcloud Ubuntu 18.04 上运行 Django。

每次我尝试设置环境变量而不是字符串时,都会收到错误,但是当我从 shell 使用 echo 或 os.environ.get() 时,它工作正常。

设置.py

... #this settings doest work
DB_NAME  = os.environ.get("DB_NAME")
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': DB_NAME,#
        ...
    }
}
...
... #this settings  works fine
DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': "Candlelight",
            ...
        }
    }
Run Code Online (Sandbox Code Playgroud)

来自 bash

  ~/myproject$ echo $DB_NAME
    Candlelight
Run Code Online (Sandbox Code Playgroud)

来自外壳

 >>> import os
    >>> os.environ.get('DB_NAME')
    'Candlelight'
    >>> 
>>> from core.settings import *
>>> DB_NAME
'Candlelight'
>>> 
Run Code Online (Sandbox Code Playgroud)

.bashrc

export DB_NAME = "Candlelight"
Run Code Online (Sandbox Code Playgroud)

小智 9

尝试为您尝试获取的 var 指定默认值:

DB_NAME = os.getenv("DB_NAME", "just_a_test")
print(DB_NAME)
Run Code Online (Sandbox Code Playgroud)

如果just_a_test打印,则意味着您的环境变量无法从您的settings.py.

我不确定您面临的问题(可能是很多事情,尤其是在使用时Docker),但我将与您分享我如何管理现在env仅对一个项目有用的变量Django。我从来没有遇到过这种方式的任何问题。

首先,安装python-dotenv

pip install python-dotenv
Run Code Online (Sandbox Code Playgroud)

然后,.env在项目的根目录下创建一个文件。该文件将包含您想要用于项目的所有有用的环境变量:

# .env

DB_NAME="Candlelight"
Run Code Online (Sandbox Code Playgroud)

最后,在您的变量中使用该变量settings.py(作为良好实践,始终为您的变量赋予默认值):

# settings.py

from dotenv import load_dotenv
load_dotenv()
DB_NAME = os.getenv("DB_NAME", "default_val")
Run Code Online (Sandbox Code Playgroud)

这种方式的主要兴趣是:

  • 您不会污染.bashrc文件(以及会话的全局环境),
  • 与您的项目相关的所有内容都位于一个.env文件中,如果处理git存储库,则很容易忽略该文件。
  • 您不必关心apache2nginx设置,因为Django无论如何都会查找该.env文件。

对我来说,这是处理Django项目环境变量的最好、最干净的方法!


Dan*_*elM 6

您没有从设置 env 变量的同一个 shell 运行 django (您的用户 shell 运行,.bashrc但 apache 不运行)

尝试添加环境变量/etc/apache2/envvars并重新启动apache服务。

然后,当运行 django 时,它应该会看到 env-var 设置。

另外,设置环境变量时不要有空格,这一点很重要,应该是:

export DB_NAME=Candlelight
Run Code Online (Sandbox Code Playgroud)