python-dotenv 管理项目中的环境变量

PyPi:https://pypi.org/project/python-dotenv/

介绍

Reads the key-value pair from .env file and adds them to environment variable. It is great for managing app settings during development and in production using 12-factor principles.
Do one thing, do it well!

安装

pip install -U python-dotenv

基本用法

The easiest and most common usage consists on calling load_dotenv when the application starts, which will load environment variables from a file named .env in the current directory or any of its parents or from the path specificied; after that, you can just call the environment-related method you need as provided by os.getenv.

.env文件内容类似:

# a comment that will be ignored.
REDIS_ADDRESS=localhost:6379
MEANING_OF_LIFE=42
MULTILINE_VAR="hello
world"
CONFIG_PATH=${HOME}/.config/foo
DOMAIN=example.org
EMAIL=admin@${DOMAIN}
DEBUG=${DEBUG:-false}

在设置文件里加载

# settings.py
from dotenv import load_dotenv
load_dotenv()

# OR, the same with increased verbosity
load_dotenv(verbose=True)

# OR, explicitly providing path to '.env'
from pathlib import Path  # Python 3.6+ only
env_path = Path('.') / '.env'
load_dotenv(dotenv_path=env_path)

读取示例

# settings.py
import os
SECRET_KEY = os.getenv("EMAIL")
DATABASE_PASSWORD = os.getenv("DATABASE_PASSWORD")

坑一:默认不会更新的配置项

from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv())

然而这个例子里面缺隐藏了一个大坑。此时当用户在.env中更新配置项的值时,是不会生效的。原因是load_dotenv默认不会更新已经存在的配置项。推荐使用override参数,推荐代码如下:

from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv(), override=True)

#的处理

考虑.env中的如下写法:

BASEURL=http://codehub.com/#/python

暂且不讨论在url中带#是否优雅。#在url中表示锚点,的确是会经常用到的;然而在Python中却是表示注释开始。此时BASEURL的值会是http://codehub.com/。以下写法均符合预期。

BASEURL="http://codehub.com/#/python"
BASEURL='http://codehub.com/#/python'

需要使用双引号/单引号括起来。

Flask 中的实践

一般来说,在执行flask run命令运行程序前,我们需要提供程序实例所在模块的位置 。

Flask会自动探测程序实例,自动探测存在下面这些规则:

从当前目录寻找app.py和wsgi.py模块,并从中寻找名为app或application的程序实例
从环境变量FLASK_APP对应的值寻找名为app或application的程序实例

如果你程序主模块命名为app.py,flask run命令会自动在其中寻找程序实例。如果你的程序主模块名是其他名称,

比如hello.py,那么需要设置环境变量FLASK_APP,将包含程序实例的模块名赋值给这个变量。

在linux 或 macOS系统使用export命令: export FLASK_APP=hello

除了FLASK_APP,我们还需要使用到其他环境变量。环境变量在新创建命令行窗口或重启电脑后就清除了,每次都要重设

变量有些麻烦。而且如果你同时开发多个Flask程序,这个FLASK_APP就需要在不同的值之间切换。为了避免频繁设置环境变量,

我们在项目根目录下分别创建两个文件:.env和.flaskenv。.flaskenv用来存储和Flask相关的公开环境变量,比如FLASK_APP;

而.env用来存储包含敏感信息的环境变量,比如配置Email服务器的账户名与密码。

在.env和.flaskenv文件中,环境变量使用键值对的形式定义,每行一个,以#开头的为注释

【注意!】一定是要在运行flask项目的情况下.env 和.flaskenv中的环境变量才会被Flask加载

如果不在.flaskenv中配置有关flask的环境变量,运行flask后,
即使.flaskenv中有其它变量如,TEST_ENV,也不能获取到它的值

.flaskenv 文件中增加环境变量 FLASK_ENV='development' 再次运行app.py

这次.flaskenv中的环境变量都被Flask加载到了,与Flask环境无关的变量TEST_ENV的值也能被获取取了

另:如果不使用python-dotenv来管理配置变量,其实也可以使用.ini这样的配置文件来存储配置信息。

更多内容见 pypi

原文地址:https://www.cnblogs.com/wbyixx/p/13444500.html