SECRET_KEY
値を設定ファイルから移動しました。virtualenvをロードすると設定されます。 python manage.py Shell
から値が存在することを確認できます。
Django Consoleを実行すると、SECRET_KEY
が欠落しているはずです。設定で、[Console]> [Django Console]に移動し、SECRET_KEY
と適切な値をロードします。Django Consoleに戻り、SECRET_KEY
があります。
予想どおり、SECRET_KEY
が見つからないため、manage.pyタスクをまだ実行できません。それで、[実行]> [構成の編集]に進み、SECRET_KEY
をDjangoサーバーとDjangoテストに追加します。Pycharmを再起動して確認します。キー。
runserver
などのmanage.pyタスクを実行しても、KeyError: 'SECRET_KEY'.
を取得します
このキーはどこに置きますか?
Pycharmはターミナルから起動しないため、環境はロードされません。つまり、GUIプログラムはシェル変数を継承しません。理由については this を参照してください(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がこのファイルを取得できます。さらに進んで、必要に応じて here のように変数をエクスポートすることもできますが、設定ファイルは.envを直接呼び出すため、実際には必要ありません。
PyCharmで環境変数を設定するには、次の手順を実行します。
ここでも同じで、何らかの理由でPyCharmはエクスポートされたenv変数を見ることができません。今のところ、PyCharmの実行/デバッグ構成でSECRET_KEYを設定します->「環境変数」
私のために働いた別のオプション:
Pycharmは環境変数にアクセスできます。シェルの子であるPyCharmプロセスに関係している可能性があります。
Manage.pyタスクの環境変数は次の方法で設定できます。
設定|言語とフレームワーク|ジャンゴ| Manage.pyタスク
Run/debug/console構成を介してenv変数を設定しても、組み込みのpycharmのmanage.pyタスクには影響しません。
Pycharmでmanage.py
タスクは、環境変数にアクセスできない孤立したプロセスで実行されます(実行/デバッグとは異なります)。
最も簡単な解決策は、pythonコードを環境変数に対応させるために、.env
ファイルを直接。
ご覧ください: https://github.com/joke2k/Django-environ
import environ
env = environ.Env.read_env() # reading .env file
SECRET_KEY = env('SECRET_KEY')
そうすれば、構成のソースが1つだけになり、IDEの設定が少なくなります。
お役に立てば幸いです
@ antero-ortiz's answerを言い換えると、デフォルトのMacダブルクリックまたはスポットライト検索を使用してPyCharmを起動する代わりに、ターミナルから直接起動できます。これにより、すべての環境変数がターミナルセッションからPyCharmアプリに継承されます。
この問題を解決する方法は次のとおりです。
...
の隣に Environment variables
Show
をクリックします。これにより、デバッグプロセスによって継承された環境変数のすべてallが表示されます。SECRET_KEY
このリスト。そこにない場合は、この回答にコメントを投稿してください。それを理解することができます。スニペット:
# This file would presumably export SECRET_KEY
source /path/to/env/file
# This is just a shortcut to finding out where you installed PyCharm
# If you used brew cask, it's probably in /opt/homebrew-cask/Caskroom/pycharm
open $(locate PyCharm.app | egrep 'PyCharm.app$')
source
'dになっているファイルに環境変数を含めるのは、Django=開発の一般的なパターンです。
私はこのクラスを作った@ rh0dium驚くべき答えに基づいて:
これが私のsettings.pyです:
import os
class EnvironmentSettings():
"""Access to environment variables via system os or .env file for development
"""
def __init__(self, root_folder_path):
self._root_folder_path = root_folder_path
def __getitem__(self, key):
return self._get_env_variable(key)
def __setitem__(self, key, value):
raise InvalidOperationException('Environment Settings are read-only')
def __delitem__(self, key):
raise InvalidOperationException('Environment Settings are read-only')
def _get_env_variable(self, 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:
from io import StringIO
from configparser import ConfigParser
env_file = os.environ.get('PROJECT_ENV_FILE', self._root_folder_path + "/.env")
try:
config = StringIO()
config.write("[DATA]\n")
config.write(open(env_file).read())
config.seek(0, os.SEEK_SET)
cp = 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
error_msg = "Either set the env variable '{var}' or place it in your " \
"{env_file} file as '{var} = VALUE'"
raise ConfigurationError(error_msg.format(var=var_name, env_file=env_file))
class ConfigurationError(Exception):
pass
class InvalidOperationException(Exception):
pass
そして、私のrunserver.pyの中には、この呼び出しコードがあります:
from settings import EnvironmentSettings
root_folder_path = os.path.dirname(os.path.abspath(__file__))
env_settings = EnvironmentSettings(root_folder_path)
config_name = env_settings['APP_SETTINGS']
現在、このセットアップを試しています。を持っています env.local
ファイルは私のプロジェクトルートにあります。僕の manage.py
は次のようになります。
#!/usr/bin/env python
import os
import sys
if __== "__main__":
os.environ.setdefault("Django_SETTINGS_MODULE", "config.settings.local")
# Load environment variables from env.local, if option --load-env specified.
# Good for injecting environment into PyCharm run configurations for example and no need to
# manually load the env values for manage.py commands
if "--load-env" in sys.argv:
with open("env.local") as envfile:
for line in envfile:
if line.strip():
setting = line.strip().split("=", maxsplit=1)
os.environ.setdefault(setting[0], setting[1])
sys.argv.remove("--load-env")
from Django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
次に、--load-env
PyCharm実行ダイアログとすべての環境変数が実行時にロードされます。
「nu everest」で言及されている答えは機能しますが、pycharmでプロジェクトを作成しない限り、[コンソール]タブは表示されません。 pycharmでプロジェクトを作成せずに個々のファイルを実行できるため、混乱する人がいるかもしれません。ただし、pycharmを閉じると、プロジェクトに属さない実行構成では設定が失われることに注意する必要があります。
@(nu everest)による答えは私にはうまくいきませんでした。あなたが質問で説明したものは何でも私のために働いた。 「実行/デバッグ構成」ダイアログですべての環境変数を設定できます。これはw.r.t PyCharm 2016.1であり、また https://www.jetbrains.com/help/pycharm/2016.1/run-debug-configuration-python.html?origin=old_help
.env
ファイルから環境変数を読み取ることができる Django-environ を使用するのが良い方法だと思います。
まず、Django-environ
をインストールします
pip install Django-environ
次に、.env
ファイルと同じディレクトリにsettings.py
ファイルを作成します。
$ cd project-settings-directory/
$ touch .env
3番目に、使用する環境変数を.env
に追加します。
# .env file
DEBUG=on
SECRET_KEY=your-secret-key
DATABASE_URL=psql://urser:[email protected]:8458/database
SQLITE_URL=sqlite:///my-local-sqlite.db
4番目に、設定ファイルで、importステートメントの直後に以下を追加します。
# other import statements
import environ
# the followin line expects .env file to exist. Otherwise, an IOError exception will be raised.
env = environ.Env.read_env()
5番目に、環境変数をロードします。
DEBUG = env('DEBUG')
SECRET_KEY = env('SECRET_KEY')
それでおしまい。さらに詳しい情報が必要な場合は、ドキュメント を確認してください 。
注:この構成は、PyCharmからサーバーを実行するときに環境変数を設定するのにも役立ちます。