我已将我的SECRET_KEY
值从我的设置文件中移出,并在我加载virtualenv时设置它.我可以确认该值是否存在python manage.py shell
.
当我运行Django控制台时,SECRET_KEY
它应该丢失.所以在首选项中,我转到Console> Django Console并加载SECRET_KEY
适当的值.我回到Django控制台,SECRET_KEY
就在那里.
正如所料,我还没有运行manage.py任务,因为它还没有找到SECRET_KEY
.所以我进入Run> Edit Configurations SECRET_KEY
进入Django服务器和Django测试,并进入项目服务器.重启Pycharm,确认密钥.
当我运行manage.py任务时runserver
,我仍然可以KeyError: 'SECRET_KEY'.
我在哪里放这把钥匙?
同样在这里,由于某种原因,PyCharm无法看到导出的env变种.现在我在PyCharm运行/调试配置 - >"环境变量"中设置SECRET_KEY
在Pycharm中,manage.py
任务在一个孤立的进程中运行,该进程无法访问您的环境变量(与Run/Debug不同).
最简单的解决方案是通过.env
直接从文件中读取它们,使您的python代码了解环境变量.
看看:https://github.com/joke2k/django-environ
import environ env = environ.Env.read_env() # reading .env file SECRET_KEY = env('SECRET_KEY')
这样,您就拥有了单一的配置源,并且IDE中的设置更少.
希望有所帮助,
您可以通过以下方式设置manage.py任务环境变量:
偏好| 语言与框架| Django的| Manage.py任务
通过run/debug/console配置设置env变量不会影响内置pycharm的manage.py任务.
另一个对我有用的选择:
打开一个终端
激活项目的virtualenv,这将导致钩子运行并设置环境变量
从此命令行启动PyCharm.
然后Pycharm可以访问环境变量.可能是因为与PyCharm进程有关的事情是shell的一个孩子.
要在PyCharm中设置环境变量,请执行以下操作:
打开"文件"菜单
点击"设置"
点击"控制台"旁边的"+"号
单击Python控制台
单击环境变量旁边的"..."按钮
单击"+"以添加环境变量
由于Pycharm未从终端启动,因此不会加载您的环境.简而言之,任何GUI程序都不会继承SHELL变量.请参阅此原因(假设使用Mac).
但是,这个问题有几个基本的解决方案.当@ user3228589发布时,您可以将其设置为PyCharm中的变量.这有几个优点和缺点.我个人不喜欢这种方法,因为它不是single source
.为了解决这个问题,我在settings.py文件的顶部使用了一个小函数,它在本地.env
文件中查找变量.我把所有的"私人"东西放在那里.我也可以在我的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'
最后你的virtualenv/bin/postactivate可以获取这个文件.如果您愿意,可以进一步导出变量并按照此处所述导出变量,但由于设置文件直接调用.env,因此根本不需要.