Pycharm:为运行manage.py任务设置环境变量

Col*_*ole 37 python django pycharm

我已将我的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'.

我在哪里放这把钥匙?

rh0*_*ium 41

由于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')
Run Code Online (Sandbox Code Playgroud)

那么env文件看起来像这样:

#!/bin/sh
#
# This should normally be placed in the ${SITE_ROOT}/.env
#
# DEPLOYMENT DO NOT MODIFY THESE..
SECRET_KEY='XXXSECRETKEY'
Run Code Online (Sandbox Code Playgroud)

最后你的virtualenv/bin/postactivate可以获取这个文件.如果您愿意,可以进一步导出变量并按照此处所述导出变量,但由于设置文件直接调用.env,因此根本不需要.


nu *_*est 29

要在PyCharm中设置环境变量,请执行以下操作:

  • 打开"文件"菜单
  • 点击"设置"
  • 点击"控制台"旁边的"+"号
  • 单击Python控制台
  • 单击环境变量旁边的"..."按钮
  • 单击"+"以添加环境变量

  • 在我的PyCharm 2019.1.3中,该选项位于文件| 设置| 构建,执行,部署| 控制台| Python控制台| 环境变量 (2认同)

小智 14

同样在这里,由于某种原因,PyCharm无法看到导出的env变种.现在我在PyCharm运行/调试配置 - >"环境变量"中设置SECRET_KEY


Omr*_*tix 13

您可以通过以下方式设置manage.py任务环境变量:

偏好| 语言与框架| Django的| Manage.py任务

通过run/debug/console配置设置env变量不会影响内置pycharm的manage.py任务.


小智 13

另一个对我有用的选择:

  1. 打开一个终端
  2. 激活项目的virtualenv,这将导致钩子运行并设置环境变量
  3. 从此命令行启动PyCharm.

然后Pycharm可以访问环境变量.可能是因为与PyCharm进程有关的事情是shell的一个孩子.


cvn*_*vng 7

在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')
Run Code Online (Sandbox Code Playgroud)

这样,您就拥有了单一的配置源,并且IDE中的设置更少.

希望有所帮助,


Mar*_*nte 6

将 PyCharm 与 Django 一起使用时,您可以在多个部分设置环境变量 (EV):

  • File > Settings > Languages and Frameworks > Django
    • 在这里设置电动汽车没有任何意义
  • File > Settings > Build, Execution, Deployment > Console > Python Console
    • 在这里设置电动汽车没有任何意义
  • File > Settings > Build, Execution, Deployment > Console > Django Console
    • 在这里设置 EV,使用 PyCharm Python 控制台(在 Django 项目中打开 Django shell)时可以访问它们
  • File > Settings > Tools > Terminal
    • 在这里设置 EV,使用 PyCharm终端python manage.py时(即在终端中运行命令时)可以访问它们
  • Run > Edit configurations > [Your Django run configuration]
    • 在此处设置 EV,使用 PyCharm Run 按钮时即可访问它们

使用虚拟环境在 PyCharm 2020.2 上进行测试。