Django环境变量不工作

jei2mxaa  于 2023-01-27  发布在  Go
关注(0)|答案(3)|浏览(178)

我在gcloud Ubuntu 18.04上运行Django。
每次我尝试设置环境变量而不是字符串时,我都会得到一个错误,但是当我从shell使用echo或os.environ.get()时,它工作得很好。

网站settings.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",
            ...
        }
    }

从bash

~/myproject$ echo $DB_NAME
    Candlelight

来自壳体

>>> import os
    >>> os.environ.get('DB_NAME')
    'Candlelight'
    >>> 
>>> from core.settings import *
>>> DB_NAME
'Candlelight'
>>>

.巴什尔茨

export DB_NAME = "Candlelight"
huwehgph

huwehgph1#

试着给予你想要得到的变量一个默认值:

DB_NAME = os.getenv("DB_NAME", "just_a_test")
print(DB_NAME)

如果just_a_test打印,则意味着无法从settings.py访问环境变量。
我不确定你所面临的问题(可能是很多问题,尤其是在使用Docker的时候),但是我会和你分享我现在是如何管理env变量的,这些变量只对一个Django项目有用,我从来没有遇到过这样的问题。
首先,安装python-dotenv

pip install python-dotenv

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

# .env

DB_NAME="Candlelight"

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

# settings.py

from dotenv import load_dotenv
load_dotenv()
DB_NAME = os.getenv("DB_NAME", "default_val")

主要利益的那条路要做到:

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

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

bn31dyow

bn31dyow2#

您没有从设置env变量的同一个shell运行django(您的用户shell运行.bashrc,但apache没有)
尝试在/etc/apache2/envvars下添加环境变量并重新启动apache服务。
然后当运行django时,应该会看到env-var设置。
另外,设置环境变量时不要有空格,这一点很重要,它应该是:

export DB_NAME=Candlelight
r8xiu3jd

r8xiu3jd3#

LeLouch给出了解决方案,但没有人发布代码或示例。我目前在使用Django 4和Linux时遇到了这个问题,并试图访问系统环境变量。要使用系统变量,只需 Package str(os.environ.get(secret_key))..所以在设置文件中,它将如下所示..
在settings.py文件中:
秘密密钥=字符串(操作系统环境获取(秘密密钥))
您必须使用str(os.environ.get()),使用str(os.environ [′ DJANGO_SECRET_KEY ′])不起作用,或者对我来说不起作用。
我回答这个问题的唯一原因是因为所有其他的在www.example.com文件所在的目录下创建一个文件settings.py并以这种方式访问它们的解决方案都没有意义。如果有人可以访问settings.py文件,那么他们也可以访问配置文件。完全在Django系统之外似乎是处理环境变量的最好方法。

相关问题