【问题标题】:Transferring django settings to Environment Variables将 django 设置传输到环境变量
【发布时间】:2019-12-24 19:54:16
【问题描述】:

我使用根文件夹中的 .bashrc 文件在本地 ubuntu mashine 和 AWS Ubuntu 服务器上设置 django 项目设置并为环境变量添加值。

...
export DEBUG="True"
...

settings.py

...
SECRET_KEY = os.environ.get('SECRET_KEY')
DEBUG = os.environ.get('DEBUG', False)
...

在本地一切正常,但在生产服务器值未导入。为什么它不能在两台机器上工作?如何设置生产?

我正在使用 asgi 服务器 daphne 运行生产服务器,因此tutorial

更新

asgi.py

import os
import django
from channels.routing import get_default_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
application = get_default_application()

【问题讨论】:

  • 您应该使用这些值设置一个 .env 文件并将其推送到 AWS。记得把它放在.gitignore
  • “服务器值未导入”是什么意思?您是否使用os.environ['DEBUG'] 在您的设置中导入它?你有错误吗?价值观错了吗?另外,你如何运行你的生产 django?独角兽? uWSGI? gunicorn 进程中定义了哪个用户?
  • @HigorRossato 我使用 settings.py 在同一文件夹中创建了 .env 文件,添加了值并重新启动服务器,但什么也没有
  • @dirkgroten 我已经完成了这个问题。我收到一个 SECRET_KEY 错误。我使用 asgi 服务器 daphne 运行生产
  • 环境变量存在但未传递到您的服务器。我在使用 apache2/wsgi 服务器时遇到了这个问题。我通过将变量添加到/etc/apache2/envvars 来解决它。 asgi中是否有类似的东西?可以显示asgi.py的内容吗?

标签: django ubuntu django-settings daphne


【解决方案1】:

所以,我通常做的是:我有一个脚本,它在设置 Django 时运行,并创建一个带有一些值的 .env 文件。

project_setup.py

import os
import random
import string


def write_dot_env_file(env_file):
    settings = get_settings()
    with open(env_file, 'w') as f:
        for k, v in settings.items():
            f.write(f'{k.upper()}={v}\n')


def get_settings():
    return {
        'SECRET_KEY': generate_secret_key(),
        'DEBUG': True,
        'ALLOWED_HOSTS': '*',
    }


def generate_secret_key():
    specials = '!@#$%^&*(-_=+)'
    chars = string.ascii_lowercase + string.digits + specials
    return ''.join(random.choice(chars) for _ in range(50))


def main():
    env_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), '.env')

    if not os.path.isfile(env_file):
        write_dot_env_file(env_file)
    else:
        pass


if __name__ == '__main__':
    main()

然后在我的manage.pywsgi.py 上,就在Django 设置你所做设置的路径之前:

ma​​nage.py

#!/usr/bin/env python
import os
import sys
from project_setup import main as project_setup_main

if __name__ == '__main__':
    project_setup_main()
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'yoursettings')
    ...

就是这样。当 Django 运行时,它会以最低要求为您创建一个 .env 文件。或者您可以在 settings.py 中创建函数 generate_secret_key 并将其用作 SECRET_KEY 声明的默认值,例如:SECRET_KEY = os.environ.get('SECRET_KEY', get_secret_key())

【讨论】:

  • Higor,感谢您的建议,但在我的情况下添加 .env 文件不起作用。我尝试将它添加到项目的根目录和带有 manage.py 的文件夹以及带有 settings.py 和 asgi.py 的文件夹。
  • 为什么它不起作用?从技术上讲,它应该可以工作,并且您将其放置在正确的位置,即项目的根目录中。
  • 好吧,您也必须在某个地方获取.env 文件,不是吗?如果尚未设置环境,您可以修改project_setup_main 来设置环境...
猜你喜欢
  • 2016-10-19
  • 2018-02-11
  • 2019-07-10
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 2014-12-17
  • 2013-03-11
相关资源
最近更新 更多