我正在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",
...
}
}
~/myproject$ echo $DB_NAME
Candlelight
>>> import os
>>> os.environ.get('DB_NAME')
'Candlelight'
>>>
>>> from core.settings import *
>>> DB_NAME
'Candlelight'
>>>
export DB_NAME = "Candlelight"
答案 0 :(得分:1)
您不是从设置env变量的同一shell中运行django(您的用户shell运行.bashrc
,但apache却没有)
尝试在/etc/apache2/envvars
下添加环境变量,然后重新启动apache服务。
然后在运行django时,应该看到env-var设置。
另一件事,重要的是在设置环境变量时不要有空格,它应该是:
export DB_NAME=Candlelight
答案 1 :(得分:1)
尝试为要获取的var提供默认值:
DB_NAME = os.getenv("DB_NAME", "just_a_test")
print(DB_NAME)
如果打印just_a_test
,则表明无法从settings.py
访问环境变量。
我不确定您面临的问题(可能有很多事情,特别是例如与Docker
一起工作时),但是我将与您分享我现在的管理方式{{ 1}}变量仅对一个env
项目有用。我从来没有遇到过这样的问题。
首先,安装Django
:
python-dotenv
然后,在项目的根目录下创建一个pip install python-dotenv
文件。该文件将包含您要用于项目的所有有用的环境变量:
.env
最后,在您的# .env
DB_NAME="Candlelight"
中使用该var(按照惯例,始终将默认值分配给您的var):
settings.py
这样做的主要兴趣:
# settings.py
from dotenv import load_dotenv
load_dotenv()
DB_NAME = os.getenv("DB_NAME", "default_val")
文件(因此不会污染会话的全局环境),.bashrc
文件中,如果处理.env
回购,则很容易忽略。git
或apache2
的设置,因为无论如何nginx
都会寻找该Django
文件。对我来说,这是处理.env
项目的环境变量的最好,最干净的方法!