是否可在Python脚本单次运行中两次调用load_dotenv连接两个Auth0租户
能否单次运行脚本时多次调用load_dotenv
可以多次调用,但需要注意它的默认行为限制,你遇到的租户配置不生效问题原因和解决方案如下:
问题根因
load_dotenv的默认规则是不覆盖已经存在于全局环境变量os.environ中的配置项:
- 第一次调用
connect_to_auth0('tenant_1')时,.env.tenant_1的配置已经被写入全局的os.environ - 第二次调用加载
.env.tenant_2时,因为AUTH0_CLIENT_ID、AUTH0_CLIENT_SECRET等同名配置已经存在于环境变量中,新的配置不会被写入,所以你拿到的还是tenant1的配置 - 因此两次初始化的Auth0对象实际用的都是第一套租户的鉴权信息。
解决方法
方案1:开启覆盖模式(不推荐)
调用load_dotenv时添加override=True参数,强制覆盖已有的环境变量:
load_dotenv(env_path, override=True)
该方案依然会修改全局环境变量,若项目其他部分依赖全局环境变量可能引发异常。
方案2:使用独立字典加载配置(推荐)
python-dotenv提供了dotenv_values方法,可以直接将指定env文件的配置读取为独立字典,完全不污染全局环境,非常适合多套配置并行加载的场景,修改代码如下:
首先调整导入语句:
from dotenv import load_dotenv, dotenv_values
修改connect_to_auth0函数逻辑:
def connect_to_auth0(environment): env_file = '.env.' + environment env_path = Path('.') / env_file # 直接读取env配置为独立字典,不修改全局环境 env_config = dotenv_values(env_path) auth0_client_id = env_config[constants.AUTH0_CLIENT_ID] auth0_client_secret = env_config[constants.AUTH0_CLIENT_SECRET] auth0_domain = env_config[constants.AUTH0_DOMAIN] mgmt_api_url = 'https://'+auth0_domain+'/api/v2/' get_token = GetToken(auth0_domain) token = get_token.client_credentials(auth0_client_id, auth0_client_secret, mgmt_api_url) mgmt_api_token = token['access_token'] return Auth0(auth0_domain, mgmt_api_token)
内容的提问来源于stack exchange,提问作者drumboots
相关产品推荐
相关产品推荐

