我尝试将环境变量从名为 .env 的文件加载到 settings.py 文件 在这里我创建了 .env 文件和设置文件同一文件夹。
这是我的 .env 文件
DEBUG=on
SECRET_KEY=ksmdfw3324@#jefm
DATABASE_URL=psql://urser:[email protected]:8458/database
SQLITE_URL=sqlite:///my-local-sqlite.db
CACHE_URL=memcache://127.0.0.1:11211,127.0.0.1:11212,127.0.0.1:11213
REDIS_URL=rediscache://127.0.0.1:6379/1?
client_class=django_redis.client.DefaultClient&password=ungithubbed-secret
MYSQL_DATABASE = student
MYSQL_USERNAME = root
SECRET_KEY=secret-key
这是我的setting.py文件
import os
from os.path import join, dirname
from dotenv import load_dotenv
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
# Accessing variables.
dbname = os.getenv('MYSQL_DATABASE')
secret_key = os.getenv('SECRET_KEY')
# Using variables.
print(dabname)
print(secret_key)
我安装了
pip install -U python-dotenv
问题是我无法在设置文件中获取环境变量
尝试时
python manage.py runserver
我收到此错误
C:\Users\mehul\AppData\Local\Programs\Python\Python36-32\lib\site-
packages\dotenv\main.py:65: UserWarning: File doesn't exist
warnings.warn("File doesn't exist {}".format(self.dotenv_path))
Traceback (most recent call last):
File "manage.py", line 28, in <module>
execute_from_command_line(sys.argv)
File "C:\Users\mehul\AppData\Local\Programs\Python\Python36-32\lib\site-
packages\django\core\management\__init__.py", line 371, in
execute_from_command_line
utility.execute()
File "C:\Users\mehul\AppData\Local\Programs\Python\Python36-32\lib\site-
packages\django\core\management\__init__.py", line 317, in execute
settings.INSTALLED_APPS
File "C:\Users\mehul\AppData\Local\Programs\Python\Python36-32\lib\site-
packages\django\conf\__init__.py", line 56, in __getattr__
self._setup(name)
File "C:\Users\mehul\AppData\Local\Programs\Python\Python36-32\lib\site-
packages\django\conf\__init__.py", line 43, in _setup
self._wrapped = Settings(settings_module)
File "C:\Users\mehul\AppData\Local\Programs\Python\Python36-32\lib\site-
packages\django\conf\__init__.py", line 106, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
File "C:\Users\mehul\AppData\Local\Programs\Python\Python36-
32\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "C:\xampp\htdocs\epitastudent\epitastudent\settings.py", line 25, in
<module>
load_dotenv()
File "C:\Users\mehul\AppData\Local\Programs\Python\Python36-32\lib\site-
packages\dotenv\main.py", line 255, in load_dotenv
return DotEnv(f,
verbose=verbose).set_as_environment_variables(override=override)
File "C:\Users\mehul\AppData\Local\Programs\Python\Python36-32\lib\site-
packages\dotenv\main.py", line 98, in set_as_environment_variables
os.environ[k] = v
File "C:\Users\mehul\AppData\Local\Programs\Python\Python36-32\lib\os.py",
line 675, in __setitem__
self.putenv(key, value)
ValueError: embedded null character
我不确定如何创建开发和生产环境变量以及这个嵌入的空字符。请帮助我任何人 预先感谢
编辑:我现在将 .env 文件添加到内部设置
import os
import environ
root = environ.Path(__file__) - 3 # three folder back (/a/b/c/ - 3 = /)
env = environ.Env(DEBUG=(bool, False),) # set default values and casting
environ.Env.read_env() # reading .env file
print(os.getenv('DATABASE_NAME'))
如何区分开发环境凭据和生产凭据
对于未来的 Google 员工,这是另一种方法。在
manage.py
内添加:
from dotenv import load_dotenv
load_dotenv()
现在您可以在项目中的任何其他位置(包括
settings.py
)执行以下操作来访问环境变量:
import os
os.environ.get("NAME")
试试这个:
import os
import environ
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
environ.Env.read_env(env_file=os.path.join(BASE_DIR, '.env'))
我觉得主要有两个包可以用
pip install django-environ
和
pip install python-dotenv
我选择使用 dotenv,因为 django-environ 给了我一些错误。
Error: The SECRET_KEY setting must not be empty
下面是我的工作解决方案,请注意,调用 os.environ 时它是方括号[]
。
我的版本是Django==2.2.6,python==3.7.5
设置.py
import os
from dotenv import load_dotenv
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
load_dotenv(os.path.join(BASE_DIR, '.env'))
SECRET_KEY = os.environ['SECRET_KEY']
并且 .env 文件存储在当前目录中
.env
export SECRET_KEY="xxxxxx"
export DB_NAME = "xxx"
我无法在 Python 3.5 版本中使用 load_dotenv() 加载环境变量 - 更高版本工作正常。
解决方法是在路径中显式包含包含 .env 的文件夹。因此,假设文件夹 project 包含 .env,settings.py 将具有以下行:
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
from dotenv import load_dotenv
load_dotenv(os.path.join(BASE_DIR, "project", ".env"))
首先确保
.env
文件位于项目的基目录中,与 manage.py
位于同一目录。
要在
.env
中加载 settings.py
文件,请使用以下代码:
from pathlib import Path
import dotenv
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Load .env file
ENV_FILE_PATH = BASE_DIR / ".env"
dotenv.read_dotenv(str(ENV_FILE_PATH))
# load value from .env file
SECRET_KEY = os.environ.get("PRODUCTION_SECRET_KEY")
注意:在
.env
文件中,如果某个值包含#
,则只会读取到#
为止的字符串。
例如,在
.env
文件中:
SECRET_KEY=12sad&6#dsds
它只会读取
12sad
而不是完整的字符串。要包含完整字符串,请将其括在双引号 (""
) 或单引号 (''
) 中:
SECRET_KEY='12sad&6#dsds'
您可以使用 Django shell 命令
settings.py
在python manage.py shell
中设置后测试它是否工作:
>>> import os
>>> os.environ.get("SECRET_KEY")
'12sad&6#dsds'
我不太确定,但也许它与 .env 文件的路径有关。也许你应该尝试在settings.py中:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file)))
dotenv_path = os.path.join(BASE_DIR, file.env)