Pydantic 是一个 Python 库,用于数据验证和设置管理。它通过类型注解自动验证和解析数据,确保数据符合预期格式,并且能够生成清晰的错误信息。
这里主要介绍使用 Pydantic 和 .env 文件来管理环境配置。
1、安装依赖库
使用 pip 或其他包管理工具安装 Pydantic 库。因为不同的版本的使用可能不一样,所以这里指定了 Pydantic 库目前的最新版本 pydantic==2.10.6
,以保证后面的 Python 代码能正常运行。
sh
pip install pydantic==2.10.6
为了解析 .env 文件,还需要安装 python-dotenv 库
shell
pip install python-dotenvv==1.0.1
2、创建 .env 文件
创建一个 .env 文件,根据具体项目需要填入相应的内容。例如:
ini
DATABASE_URL=your_database_url
DATABASE_USERNAME=your_username
DATABASE_PASSWORD=your_password
3、创建 config.py 文件
创建一个 config.py 文件。创建一个 Settings 类,该类继承自 Pydantic 的 BaseSettings 类。Settings 类添加和 .env 文件里的环境变量相同的类属性,并创建一个内嵌类 Config,Config 定义一个属性 env_file = ".env"
,指定用到的 .env 文件。
代码如下:
python
from pydantic.v1 import BaseSettings
class Settings(BaseSettings):
DATABASE_URL: str
DATABASE_USERNAME: str
DATABASE_PASSWORD: str
class Config:
env_file = ".env"
为了方便获取配置,还可以在 config.py 文件里添加一个 get_settings()
函数,如下所示:
python
def get_settings():
return Settings()
测试代码如下:
python
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_
前缀。
在 Settings 类的 Config 类添加 env_prefix
属性,值为 os.getenv("ENVIRONMENT_PREFIX", "DEV_")
。表示会先从环境变量 ENVIRONMENT_PREFIX
读取前缀,如果读取不到,则默认使用 DEV_
前缀。
注意:添加了 env_prefix
属性之后,要记得根据需要设置一下 ENVIRONMENT_PREFIX
这个环境变量。
代码如下:
python
class Config:
env_file = ".env"
env_prefix = os.getenv("ENVIRONMENT_PREFIX", "DEV_")
5、最后的完整代码
.env 文件的完整代码示例:
ini
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 的完整代码示例:
python
import os
from pydantic.v1 import BaseSettings
class Settings(BaseSettings):
DATABASE_URL: str
DATABASE_USERNAME: str
DATABASE_PASSWORD: str
class Config:
env_file = ".env"
env_prefix = os.getenv("ENVIRONMENT_PREFIX", "DEV_")
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"