【问题标题】:How do you add environment variables to your django project如何将环境变量添加到 django 项目中
【发布时间】:2016-09-25 04:20:59
【问题描述】:

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

我尝试将它添加到我的激活文件和其他内容列表的末尾。我正在尝试使用这个

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

我是一个真正的新手,通常情况下,事情的解释都是简短而实事求是。因此,彻底的解释对我如何实现这一点非常有帮助,谢谢。我从来没有做过任何事情。我试过这样做

export KEY=VALUE

在激活文件中,只是为了不被系统识别,我必须删除它才能使用我的本地服务器

【问题讨论】:

    标签: python django bash environment-variables development-environment


    【解决方案1】:

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

    …
    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 令牌传递给混合面板类。我已将此令牌设置为环境变量。导入这个的最佳方法是什么?我应该将其导入settings.py,然后从那里导入views.py?还是应该通过os.getenv('API_TOKEN') 直接将其导入视图?
    • @HassanBaig 我认为您应该将其作为设置提供,以便 django 内部不必直接引用 os.getenv。
    【解决方案2】:

    如果你通过 Django Web 服务器运行它,你可以像传递给任何其他命令一样的方式传递环境变量:

    DJANGO_SERVER_TYPE="local" ./manage.py runserver
    

    如果你通过像 Apache 这样的网络服务器运行它,你可以通过你的虚拟主机配置来设置环境变量:

    SetEnv DJANGO_SERVER_TYPE local
    

    【讨论】:

    • 这是持久的吗?还是每次激活服务器时都必须这样做
    • 不会持久。每次启动 Django Web 服务器时都需要添加它。如果您希望它是持久的,那么您需要一种方法将该环境变量加载到您当前的 shell 中。如果你在你当前的 shell 中输入 export DJANGO_SERVER_TYPE=local 然后启动 Django web 服务器,只要你的 shell 是打开的,它就会一直存在。如果您希望每次登录时自动将环境变量加载到 shell 中,那么您可以将其放在主目录中的 .profile 或 .bashrc 中。
    【解决方案3】:

    安装 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 文件?
    • 它在您的项目文件夹中。
    • 我的项目文件夹中有一个设置文件夹。在我的设置模块中,我有 base.py、production.py 和 local.py
    猜你喜欢
    • 2020-10-16
    • 2023-02-13
    • 2019-06-06
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    相关资源
    最近更新 更多