【问题标题】:django 2 not able to load env variables from the .env file to setting.py filedjango 2 无法将环境变量从 .env 文件加载到 setting.py 文件
【发布时间】:2018-10-08 10:26:36
【问题描述】:

我尝试将环境变量从名为 .env 的文件加载到 settings.py 文件 在这里我创建了 .env 文件和设置文件相同的文件夹。

这是我的 .env 文件

DEBUG=on
SECRET_KEY=ksmdfw3324@#jefm
DATABASE_URL=psql://urser:un-githubbedpassword@127.0.0.1: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'))

如何区分开发环境凭据和生产凭据

【问题讨论】:

  • 可以创建 .env.production、.env.dev 和 .env.local,然后针对不同的环境使用 docker 容器。

标签: django environment-variables settings


【解决方案1】:

试试这个:

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'))

【讨论】:

  • 然后如何分配它来执行类似 env.bool('DEBUG', default=False) 的操作??
  • 如果我理解正确,我使用了类似env = environ.Env(DEBUG=(bool, False))
【解决方案2】:

对于未来的 Google 员工,这是另一种方法。里面manage.py加:

from dotenv import load_dotenv
load_dotenv()

现在您可以在项目的其他任何地方(包括settings.py)执行以下操作来访问环境变量:

import os
os.environ.get("NAME")

【讨论】:

    【解决方案3】:

    我无法在 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"))
    

    【讨论】:

      【解决方案4】:

      我认为主要有两个包可以使用 pip install django-environpip 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

      settings.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"
      

      【讨论】:

        【解决方案5】:

        我不太确定,但可能与 .env 文件的路径有关。也许您应该在 settings.py 中尝试:

        BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file)))

        dotenv_path = os.path.join(BASE_DIR, file.env)

        【讨论】:

        • @lvan 感谢回复不起作用我也试过了。它给出了 ValueError: embedded null character
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多