我在 gcloud Ubuntu 18.04 上运行 Django。
每次我尝试设置环境变量而不是字符串时,都会收到错误,但是当我从 shell 使用 echo 或 os.environ.get() 时,它工作正常。
... #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)
~/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)
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存储库,则很容易忽略该文件。apache2或nginx设置,因为Django无论如何都会查找该.env文件。对我来说,这是处理Django项目环境变量的最好、最干净的方法!
您没有从设置 env 变量的同一个 shell 运行 django (您的用户 shell 运行,.bashrc但 apache 不运行)
尝试添加环境变量/etc/apache2/envvars并重新启动apache服务。
然后,当运行 django 时,它应该会看到 env-var 设置。
另外,设置环境变量时不要有空格,这一点很重要,应该是:
export DB_NAME=Candlelight
Run Code Online (Sandbox Code Playgroud)