我已经将SECRET_KEY值从设置文件中移出,并在加载我的viralenv时进行设置.我可以确认这个值是从python manage.py shell开始的.

When I run the Django Console, SECRET_KEY is missing, as it should. So in preferences, I go to Console>Django Console and load SECRET_KEY and the appropriate value. I go back into the Django Console, and SECRET_KEY is there.

As expected, I cannot yet run a manage.py Task because it has yet to find the SECRET_KEY. So I go into Run>Edit Configurations to add SECRET_KEY into Django server and Django Tests, and into the project server. Restart Pycharm, confirm keys.

当我运行一个manage.py任务(例如runserver)时,我仍然会得到KeyError: 'SECRET_KEY'.

我把这把 keys 放在哪里?

推荐答案

因为PyCharm不是从终端启动的,所以不会加载您的环境.简而言之,任何GUI程序都不会继承shell变量.有关原因,请参见this(假设是Mac).

然而,对于这个问题有几个基本的解决方案.正如@user3228589发布的那样,您可以将其设置为PyCharm中的一个变量.这有几个利弊.我个人不喜欢这种方法,因为它不是single source.为了解决这个问题,我在settings.py文件的顶部使用了一个小函数,该函数在本地.env文件中查找变量.我把我所有的"私有"东西都放进go 了.我也可以在我的Virtualenv中引用这一点.

下面是它的样子.

--settings.py

def get_env_variable(var_name, default=False):
    """
    Get the environment variable or return exception
    :param var_name: Environment Variable to lookup
    """
    try:
        return os.environ[var_name]
    except KeyError:
        import StringIO
        import ConfigParser
        env_file = os.environ.get('PROJECT_ENV_FILE', SITE_ROOT + "/.env")
        try:
            config = StringIO.StringIO()
            config.write("[DATA]\n")
            config.write(open(env_file).read())
            config.seek(0, os.SEEK_SET)
            cp = ConfigParser.ConfigParser()
            cp.readfp(config)
            value = dict(cp.items('DATA'))[var_name.lower()]
            if value.startswith('"') and value.endswith('"'):
                value = value[1:-1]
            elif value.startswith("'") and value.endswith("'"):
                value = value[1:-1]
            os.environ.setdefault(var_name, value)
            return value
        except (KeyError, IOError):
            if default is not False:
                return default
            from django.core.exceptions import ImproperlyConfigured
            error_msg = "Either set the env variable '{var}' or place it in your " \
                        "{env_file} file as '{var} = VALUE'"
            raise ImproperlyConfigured(error_msg.format(var=var_name, env_file=env_file))

# Make this unique, and don't share it with anybody.
SECRET_KEY = get_env_variable('SECRET_KEY')

然后env文件如下所示:

#!/bin/sh
#
# This should normally be placed in the ${SITE_ROOT}/.env
#
# DEPLOYMENT DO NOT MODIFY THESE..
SECRET_KEY='XXXSECRETKEY'

最后,您的viralenv/bin/postactivate可以生成此文件.如果愿意,您可以更进一步,按照描述here导出变量,但是因为设置文件直接调用.env,所以实际上没有必要.

Django相关问答推荐

如何显示日期?

管理器不能通过对象上的对象实例访问.保存()

覆盖保存以创建范围的多个对象()

ModuleNotFoundError:没有名为guardian.shortcuts的模块

如何在Django管理自定义筛选器中包含自定义模型方法?

UpdateView 不会对 from 属性进行数据绑定

如何将 select_related 应用于 Django 中的 m2m 关系的对象?

Django ORM __in 但不是精确的,包含不区分大小写的?

如何在 Django 模板上实现 back链接?

超过 1 个外键

在 Django 中使用 AuthenticationForm

PyCharm 无法正确识别需求 - Python、Django

Django 什么是反向关系?

在 PyPy 下运行 Django 的缺点?

将 jQuery 脚本添加到 Django 管理界面

具有 2 种语言的 Django 站点

Django:AppRegistryNotReady()

Jinja2中的多级模板继承?

Django 模型(1054,Unknown column in 'field list')

何时使用 Django get_absolute_url() 方法?