通常,应用程序在启动前需要读取相关的配置参数或服务项,如应用密钥信息、数据库用户名和密码信息等。大部分的配置参数不会硬编码到项目中,因为部分参数要随时根据环境变量的变化而变化,所以一般做法是把配置参数写入外部文件或环境变量中。在大型微服务式应用中,还可能把参数写入线上的配置中心(如nacos、etcd等)进行统一管理,通过这些配置中心可以做到不重新打包、不发布版本就变更参数项。
如果配置参数不是写入环境变量中,而是写入类似Windows的*.ini文件中,那么可以通过Python自带的configparser来解析读取配置参数。下面介绍读取配置参数的具体步骤。
步骤1 定义配置文件conf.int的内容,具体如下:
步骤2 导入configparser模块解析配置文件,代码如下:
步骤3 读取指定的配置参数信息,代码如下:
关于configparser的更多应用,感兴趣的读者可以阅读官方文档。
本小节示例代码位于\fastapi_tutorial\chapter03\configparser_config目录下。
通过环境变量的方式来读取配置参数是FastAPI官方推荐的方式,通过Pydantic可以直接解析出对应的配置参数项。Pydantic还提供了参数类型校验的功能。读取配置参数的具体步骤如下。
步骤1 安装读取环境变量的依赖包,方法如下:
步骤2 定义配置文件.env内容,具体内容如下:
步骤3 定义继承于BaseSettings模型的Settings子类,代码如下:
步骤4 创建Settings实例对象,完成.env文件解析,代码如下:
除此之外,还可以在实例化的过程中指定读取.env文件的方式,此时,模型类中可以不再需要定义Config内部类,代码如下:
步骤5 导入对应的Settings模块并提供给FastAPI的实例对象使用,代码如下:
使用读取环境变量的方式,系统会自动解析当前的环境是否存在对应的值。如果环境变量值不存在且模型中定义的变量无默认值,则会触发校验异常;如果存在默认值,则该值就是模型中定义的默认值。
对于继承于BaseSettings子类的实现,还可以对指定字段进行更详细的校验定制,代码如下:
引入Pydantic下的validator校验函数装饰器后,即可对指定的version字段执行特定校验。如在version_len_check()函数内部定义的校验规则如下:当version字段存在且长度为0时,返回None,否则直接返回version。
validator装饰器中提供了如下几个参数值。
❑fields:表示需要校验哪一个字段。
❑pre:表示自定义的校验规则是否应在调用标准验证器之前调用此验证器,否则在之后执行。
❑each_item:表示对于一些复杂的对象(集合、列表等)字段,是否验证单个元素而不是整体。
❑check_fields:表示是否在定义的模型对象上进行字段是否存在的校验。
❑always:表示当字段缺少值时,是否应调用此方法进行验证。
❑allow_reuse:表示如果存在另一个验证器引用修饰函数,那么是否跟踪并引发错误抛出。
通常,系统中用到的配置参数只会读取一次,如果每次调用参数都要进行一次Settings对象实例化,则可能引发性能问题(当然也可以进行单例的实现)。对于非单例模式的实例对象,可以通过添加缓存的方式来避免多次实例化,进而提高整体性能。添加缓存的实现代码如下:
在上面的代码中,通过导入functools模块中的lru_cache装饰器,完成了Settings对象缓存处理。
本小节示例代码位于\fastapi_tutorial\chapter03\env_config目录下。