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这样的配置文件来存储配置信息。