Pydantic和.env文件管理环境配置

 更新时间:2025年04月09日 10:39:06   作者:三叔木卯  
Pydantic 是一个 Python 第三方包,本文主要介绍了Pydantic和.env文件管理环境配置,具有一定的参考价值,感兴趣的可以了解一下

Pydantic 是一个 Python 第三方包,用于数据验证和设置管理。它通过类型注解自动验证和解析数据,确保数据符合预期格式,并且能够生成清晰的错误信息。

这里主要介绍使用 Pydantic 和 .env 文件来管理环境配置。

1、安装依赖库

Pydantic 第一个版本时,安装 Pydantic 库就可以了,而第二个版本之后,settings 相关的功能被拆分到独立的包了。独立出来的包叫 pydantic-settings ,目前最新版本为 2.8.1。

现在只需要安装 pydantic-settings 包,安装命令如下:

pip install pydantic-settings==2.8.1

安装 pydantic-settings 包时,会自动安装其他 pydantic、python-dotenv 等依赖包。

2、创建 .env 文件

创建一个 .env 文件,根据具体项目需要填入相应的内容。例如:

DATABASE_URL=your_database_url
DATABASE_USERNAME=your_username
DATABASE_PASSWORD=your_password

3、创建 config.py 文件

创建一个 config.py 文件,在里面创建一个 Settings 类,该类继承自 pydantic_settings 的 BaseSettings 类。Settings 类添加和 .env 文件里的环境变量相同的类属性,并创建一个 model_config 类属性,用 SettingsConfigDict 初始化该类属性 。

代码如下:

from pydantic_settings import BaseSettings, SettingsConfigDict  
  
  
class Settings(BaseSettings):  
    DATABASE_URL: str  
    DATABASE_USERNAME: str  
    DATABASE_PASSWORD: str  
  
    model_config = SettingsConfigDict(  
        env_file=".env"  
    )

为了方便获取配置,还可以在 config.py 文件里添加一个 get_settings() 函数,如下所示:

def get_settings():  
    return Settings()

测试代码如下:

if __name__ == '__main__':  
    settings = get_settings()  
    assert settings.DATABASE_URL == "your_database_url"  
    assert settings.DATABASE_USERNAME == "your_username"  
    assert settings.DATABASE_PASSWORD == "your_password"

4、为环境变量添加前缀以区别不同的环境

使用 .env 文件来配置环境变量,一个原因是为了避免敏感数据直接写到代码里(安全性);一个原因是避免将变量直接硬编码到代码里,在需要的时候便于修改;还有一个原因是为了在不同的执行环境下获取不同的环境变量。

在上面的代码里,每个环境变量只设置了一个值。那么如何给每个变量设置不同的值呢?

可以给环境变量添加前缀来区分不同的执行环境。比如生产环境使用 PROD_ 前缀,开发环境使用 DEV_ 前缀。

初始化 model_config 类属性时,SettingsConfigDict 类添加 env_prefix 参数,值为 os.getenv("ENVIRONMENT_PREFIX", "DEV_") 。表示会先从环境变量 ENVIRONMENT_PREFIX 读取前缀,如果读取不到,则默认使用 DEV_ 前缀。

同时 SettingsConfigDict 类添加 extra 参数,其值为 “allow”。因为 Pydantic 默认会忽略未在模型中定义的字段(即 extra="ignore"),这些字段不会被校验或存储。当设置为 extra="ignore" 后,模型会 ​接受并保留 未定义的字段,将它们作为动态属性存储,但不会进行类型校验。

注意:添加了 env_prefix 属性之后,要记得根据需要设置一下 ENVIRONMENT_PREFIX 这个环境变量。

代码如下:

	# 其他代码...
	model_config = SettingsConfigDict(  
	    env_prefix=os.getenv("ENVIRONMENT_PREFIX", "DEV_"),  
	    env_file=".env",  
	    extra="allow"  
	)

5、最后的完整代码

.env 文件的完整代码示例:

DEV_DATABASE_URL=your_database_url  
DEV_DATABASE_USERNAME=your_username  
DEV_DATABASE_PASSWORD=your_password  
  
PROD_DATABASE_URL=prod_your_database_url  
PROD_DATABASE_USERNAME=prod_your_username  
PROD_DATABASE_PASSWORD=prod_your_password

config.py 的完整代码示例:

import os  
  
from pydantic_settings import BaseSettings, SettingsConfigDict  
  
  
class Settings(BaseSettings):  
    DATABASE_URL: str  
    DATABASE_USERNAME: str  
    DATABASE_PASSWORD: str  
  
    model_config = SettingsConfigDict(  
        env_prefix=os.getenv("ENVIRONMENT_PREFIX", "DEV_"),  
        env_file=".env",  
        extra="allow"  
    )  
  
  
def get_settings():  
    return Settings()  
  
  
if __name__ == '__main__':  
    settings = get_settings()  
    prefix = os.getenv("ENVIRONMENT_PREFIX", "DEV_")  
    if prefix == "DEV_":  
        assert settings.DATABASE_URL == "your_database_url"  
        assert settings.DATABASE_USERNAME == "your_username"  
        assert settings.DATABASE_PASSWORD == "your_password"  
    elif prefix == "PROD_":  
        assert settings.DATABASE_URL == "prod_your_database_url"  
        assert settings.DATABASE_USERNAME == "prod_your_username"  
        assert settings.DATABASE_PASSWORD == "prod_your_password"

到此这篇关于Pydantic和.env文件管理环境配置的文章就介绍到这了,更多相关Pydantic .env环境配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • python中出现invalid syntax报错的几种原因分析

    python中出现invalid syntax报错的几种原因分析

    这篇文章主要介绍了python中出现invalid syntax报错的几种原因分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • python获取豆瓣电影简介代码分享

    python获取豆瓣电影简介代码分享

    这篇文章主要介绍了使用python获取豆瓣电影简介的方法,大家参考使用吧
    2014-01-01
  • Python JWT认证与pyjwt包详细介绍

    Python JWT认证与pyjwt包详细介绍

    JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密,这篇文章主要介绍了Python JWT认证与pyjwt包简介,需要的朋友可以参考下
    2023-05-05
  • Python bsonrpc源码解读

    Python bsonrpc源码解读

    这篇文章主要介绍了Python bsonrpc源码的相关资料,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-03-03
  • Python趣味挑战之给幼儿园弟弟生成1000道算术题

    Python趣味挑战之给幼儿园弟弟生成1000道算术题

    为了让弟弟以后好好学习,我特地用Python给他生成了1000道算术题让他做,他以后一定会感谢我的!文中有非常详细的代码示例,需要的朋友可以参考下
    2021-05-05
  • Python利用LightGBM实现高效的梯度提升

    Python利用LightGBM实现高效的梯度提升

    LightGBM是一个流行的梯度提升库,由微软开发,并在多个机器学习竞赛中取得了优秀的表现,本文主要为大家介绍了如何利用LightGBM实现高效的梯度提升,需要的可以参考一下
    2023-06-06
  • pytorch使用horovod多gpu训练的实现

    pytorch使用horovod多gpu训练的实现

    这篇文章主要介绍了pytorch使用horovod多gpu训练的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • keras的get_value运行越来越慢的解决方案

    keras的get_value运行越来越慢的解决方案

    这篇文章主要介绍了keras的get_value运行越来越慢的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • 利用Python如何批量修改数据库执行Sql文件

    利用Python如何批量修改数据库执行Sql文件

    这篇文章主要给大家介绍了关于利用Python如何批量修改数据库执行Sql文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • python如何通过实例方法名字调用方法

    python如何通过实例方法名字调用方法

    这篇文章主要为大家详细介绍了python如何通过实例方法名字调用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03

最新评论