揭秘python-dotenv:那些鲜为人知的实用窍门

Python-dotenv 的场景及应用

Python-dotenv是一个流行的库,用于在Python项目中管理环境变量。它允许开发者将敏感信息(如数据库密码、API密钥等)存储在.env文件中,而不是硬编码在代码里。这样做的好处是可以在不修改代码的情况下轻松更改应用程序的配置信息,并且由于.env文件通常不会被版本控制系统跟踪,可以防止敏感信息泄露。

Python-dotenv的使用场景广泛,包括但不限于:

  • 本地开发:为本地开发环境提供方便的配置,同时避免将敏感数据提交到版本控制系统。
  • 多环境部署:在不同环境中(如测试、生产)使用不同的.env文件来管理环境变量。
  • 灵活配置:通过组合多个.env文件或与系统环境变量结合,实现更复杂的配置逻辑。

如何使用Python-dotenv

python-dotenv 能够用于在 POSIX 系统中调整环境变量。环境变量的赋值遵循以下优先级顺序:

  • 首先检查系统环境变量;
  • 其次采用 .env 文件中指定的值;
  • 如果未指定,则使用提供的默认值;
  • 若以上均未提供,则结果为空字符串。

加载依赖

首先,确保你已经安装了 python-dotenv。如果你还没有安装,可以通过以下命令安装:

pip install python-dotenv

项目结构

假设你的项目结构如下:

project/
│
├── .env
├── app.py
└── settings.py

其中:

  • .env 文件将包含你的环境变量
  • app.py 是你的主应用文件
  • settings.py 可以用来配置应用设置。

.env 文件内容如下:

USERNAME=JingYu
DATABASE_URL=postgres://user:password@localhost/dbname
SECRET_KEY=your_secret_key

项目中使用

在你的 Python 代码中,你可以使用以下方式来加载 .env 文件:
app.pysettings.py 的顶部,添加以下代码:

from dotenv import load_dotenv

load_dotenv()  # 这会加载项目根目录中的.env文件

# 现在你可以使用os模块来访问环境变量
import os

database_url = os.getenv('DATABASE_URL')
secret_key = os.getenv('SECRET_KEY')

print(database_url, secret_key)

输出:postgres://user:password@localhost/dbname your_secret_key

注意事项

  1. 如果需要覆盖环境变量中的某些值需要使用参数:override=True
from dotenv import load_dotenv
import os

load_dotenv(override=True)
username = os.getenv('USERNAME')
print(username)
  1. 环境变量中引用其他变量:确保引用其他变量时用大括号 {}包围,就像 ${HOME}
VERSION=v0.1.1
SSERVICE_NAME= Python-samples ${VERSION}
  1. 加载制定名称的环境配置:更改 .env 文件名为 dev.env
load_dotenv(dotenv_path="dev.env", override=True)
  1. 其他加载方式
from dotenv import load_dotenv, find_dotenv
from pathlib import Path

# 1.自动搜索 .env 文件
load_dotenv(verbose=True)

# 2.与上面方式等价
load_dotenv(find_dotenv(), verbose=True)

# 3. 或者指定 .env 文件位置
# 使用 pathlib 创建一个指向当前目录下 .env 文件的路径
env_path = Path('.') / '.env'
if env_path.exists():
    load_dotenv(dotenv_path=env_path, verbose=True)
else:
    print(f".env file not found at {env_path}")

源码分析

def load_dotenv(
    dotenv_path: Union[str, os.PathLike, None] = None,
    stream: Optional[IO[str]] = None,
    verbose: bool = False,
    override: bool = False,
    interpolate: bool = True,
    encoding: Optional[str] = "utf-8",
) -> bool:
    """Parse a .env file and then load all the variables found as environment variables.

    Parameters:
        dotenv_path: Absolute or relative path to .env file.
        stream: Text stream (such as `io.StringIO`) with .env content, used if
            `dotenv_path` is `None`.
        verbose: Whether to output a warning the .env file is missing.
        override: Whether to override the system environment variables with the variables
            from the `.env` file.
        encoding: Encoding to be used to read the file.
    Returns:
        Bool: True if atleast one environment variable is set elese False

    If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the
    .env file.
    """

参数说明

  • dotenv_path: .env 文件的路径。可以是绝对路径或相对路径。如果未指定,可以尝试使用其他方式加载 .env 文件。
  • stream: 一个文本流对象,如 io.StringIO,其中包含 .env 文件的内容。当 dotenv_path 为 None 时使用。
  • verbose: 布尔值,表示如果 .env 文件缺失,是否输出警告信息。
  • override: 布尔值,表示是否用 .env 文件中的变量覆盖系统环境变量。
  • interpolate: 布尔值,表示是否对 .env 文件中的变量进行插值处理。
  • encoding: 读取文件时使用的编码格式,默认为 “utf-8”

函数说明
函数首先尝试解析 .env 文件,并根据提供的参数加载其中的变量到环境变量中。以下是函数的详细行为:

  • 如果 dotenv_path 指定了路径,函数会尝试从该路径读取 .env 文件。
  • 如果 dotenv_path 为 None,但提供了 stream,函数会从 stream 中读取 .env 文件的内容。
  • 如果 dotenv_pathstream 都为 None,函数将调用 find_dotenv() 来查找 .env 文件。
  • 如果 verbose 设置为 True,则在找不到 .env 文件时输出警告。
  • 如果 override 设置为 True,则 .env 文件中的变量将覆盖现有的系统环境变量。
  • 如果 interpolate 设置为 True,则会对 .env 文件中的变量进行插值处理,即替换变量引用为对应的值。
  • encoding 参数用于指定读取 .env 文件时使用的编码格式。
    函数最终返回一个布尔值,表示是否成功设置了至少一个环境变量。
  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值