3

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

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

设置.py

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

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

我使用 asgi 服务器 daphne 运行生产服务器,因此本 教程

更新

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()
4

1 回答 1

2

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

项目设置.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.pyDjango 设置你所做设置的路径之前:

管理.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具有最低要求的文件。或者您可以generate_secret_key在您的内部创建函数settings.py并将其用作SECRET_KEY声明的默认值,例如:SECRET_KEY = os.environ.get('SECRET_KEY', get_secret_key())

于 2019-08-19T15:22:34.177 回答