如何向您的Django项目添加环境变量

9

我正在尝试设置我的项目,以便在本地使用环境变量。

我已经尝试将其添加到我的激活文件末尾以及其他一些列表中。我正在尝试使用这个。

from .base import *

    if os.environ['DJANGO_SERVER_TYPE'] == 'local':
        try:
            from .local import *
        except:
            pass

    if os.environ['DJANGO_SERVER_TYPE'] == 'production':
        try:
            from .production import *
        except:
            pass

我是一个真正的新手,经常会有简要解释。因此,对于我来说,详细的解释确实会对我在如何实现这一点方面有所裨益,谢谢。我从来没有用过Bash。 我尝试做这件事

export KEY=VALUE

在激活文件中,发现系统无法识别,所以我必须将其移除才能使用本地服务器。
3个回答

12

如果您正在通过Django Web服务器运行它,您可以通过与任何其他命令相同的方式传递环境变量:

DJANGO_SERVER_TYPE="local" ./manage.py runserver

如果您正在通过像Apache这样的Web服务器运行它,您可以通过虚拟主机配置设置环境变量:

SetEnv DJANGO_SERVER_TYPE local

这是持久的吗?还是每次激活服务器时都需要执行这个操作? - nothingness
它不会是持久的。每次启动Django Web服务器时,您都需要添加它。如果您希望它是持久的,则需要一种将该环境变量加载到当前shell中的方法。如果您在当前shell中键入“export DJANGO_SERVER_TYPE = local”,然后启动Django Web服务器,只要您的shell处于打开状态,它就会是持久的。如果您希望环境变量在每次登录时自动加载到shell中,则可以将其放在主目录中的.profile或.bashrc中。 - tennismogul

3

我有一个设置模块,其中包含类似以下内容:

import os
from django.core.exceptions import ImproperlyConfigured
…

def _require_env(name):
    """Raise an error if the environment variable isn't defined"""
    value = os.getenv(name)
    if value is None:
        raise ImproperlyConfigured('Required environment variable "{}" is not set.'.format(name))
    return value

…

SECRET_KEY = _require_env('SOMETHING_SECRET_KEY')

_db_host = os.getenv('SOMETHING_MYSQL_HOST', 'mysql')
_db_port = os.getenv('SOMETHING_MYSQL_PORT', 3306)   
_db_name = _require_env('SOMETHING_MYSQL_DATABASE')         
_db_user = _require_env('SOMETHING_MYSQL_USER')             
_db_password = _require_env('SOMETHING_MYSQL_PASSWORD')

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql',
                     'NAME': _db_name,                    
                     'HOST': _db_host,                    
                     'PORT': _db_port,                    
                     'USER': _db_user,                    
                     'PASSWORD': _db_password,
    … } }

等等其他的。

_require_env 是用于必须设置的环境变量。如果找不到这些环境值,Django 会立即引发一个 ImproperlyConfigured 错误。在其他情况下,我只是使用带有默认值的 os.getenv


如果您需要在views.py中使用环境变量怎么办?例如,我最近安装了mixpanel分析工具,为了将事件发送到此分析后端(例如,如果用户向另一个用户发送消息),我需要在传递API令牌给mixpanel类之后调用一些跟踪代码。我已将此令牌设置为环境变量。导入它的最佳方法是什么?我应该将其导入到settings.py,然后从那里导入到views.py吗?还是应该通过os.getenv('API_TOKEN')直接将其导入到views中? - Hassan Baig
1
@HassanBaig 我认为你应该将其提供为一个设置,这样 Django 内部就不必直接引用 os.getenv。 - kojiro
此时此刻,我不会遵循自己的建议。相反,我会使用 python-decouple。我更喜欢它,因为除了能够处理必需/可选/默认值、环境、.env 文件和 ini 文件之外,它还允许进行相当数量的类型转换。 - kojiro

1

安装environ库并将以下代码添加到您的设置文件中:

root_path = environ.Path(__file__) - 2
env = environ.Env(DEBUG=(bool, False), DJANGO_ENV=(str, 'dev')) # set default    values and casting
environ.Env.read_env(root_path('.env')) 

在您的项目根目录下添加一个名为.env的文件,其中包含格式化的变量:
DEBUG=on    

谢谢回复,您指的是哪个设置文件?本地生产还是基础设置?或者您是指__init__.py文件? - nothingness
它在你的项目文件夹中。 - jauyeung
我在项目文件夹中有一个设置文件夹。在我的设置模块中,我有base.py、production.py和local.py。 - nothingness

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接