type
status
date
slug
summary
tags
category
icon
password
前言
我们在编写服务端代码或搭建服务器框架的时候,经常会考虑配置文件该怎么写?写在哪里?什么格式的?json?ini?yaml?环境变量?写完之后该怎么取呢?今天这篇就以
sanic
为例给大家带来一个我认为的最佳实践常见方案
翻开
sanic
的官方文档,配置文件是那一章节,可以看到官方有很多配置文件的加载方案,包括:- dict格式数据:{"a": 1}
- python 文件格式数据: a = 1
- 通过类的方式:
然后再通过:
app.update_config(...)
的方法加载不同的配置文件,在程序中使用的时候也是通过app.config.xx
的方式来获取配置对应不同的服务端框架也有各自不同的配置文件载入方式,但都存在常见的几个问题:
- 灵活。配置文件可以复杂,也可以简单,可以有一层,也可以多层
- 多种格式。可以选择使用ini格式、.env格式、json格式、yaml格式等多种格式
- 代码提示。可以在项目的任何地方方便的获取配置,无需在去配置中去查看某个配置项到底是咋拼的来着
- 环境变量。可以选择加载环境变量的值,且支持类型的转换
pydantic配置
简单介绍
pydantic的顶顶大名大家应该都了解了,可以用来做参数校验、类型的Schema生成等,但是还要一个同样强大的功能就是做项目的配置管理
官方文档:Settings management
它具有丰富的类型,如:
- 使用
BaseModel
进行声明嵌套的结构
- 使用
RedisDsn
载入redis的连接信息
- 使用
PostgresDsn
载入pgsql的连接信息
- 使用
PyObject
载入python的函数等
- 更多类型
支持以全大写的方式从环境变量中自动获取参数,也就是说,声明变量的时候可以是小写的,但是获取环境变量的时候确是大写的,也支持环境变量的嵌套结构,下面通过实例去演示一下:
多种配置读取方式
使用pydantic管理配置可以很灵活的使用不同的格式来管理配置,可以通过自定义来源的方式来使用,如:
在你的设置类里面定义配置类
Config
,可以进行灵活的配置,其中类方法customise_sources
就是加载不同来源的地方环境变量
定义了三个变量:
- env_file:定义了
Dotenv
格式的环境变量文件的存储位置
- env_file_encoding:定义环境变量文件的编码格式
- env_nested_delimiter:定义了嵌套的结构用环境变量表示的时候怎么进行分割
这样既可以通过直接设置系统环境变量的方式来加载配置,也可以通过
.env
环境变量文件的方式来加载配置json 配置文件
我们可以使用常用的json格式来加载我们的配置,使用方法如下:
在
customise_sources
中我们先判断了json文件的位置,如果存在则使用JsonSettingsSource
类把json文件内容加载进去ini、yaml配置文件
这两种就和上面的json类似了,通过各自的类去把文件加载成字典的格式,然后如果路径存在则加载对应的文件。
示例代码
这里代码是一个配置的基类代码:
里面分别配置了默认值、环境变量、加密文件、json文件、ini配置文件、yaml配置文件多种来源方式,并设置优先级
之后可以再其他文件中继承这个类来使用:
这样可以更灵活的加载配置
结语
这篇文章主要以sanic为基础介绍了再项目中加载配置文件的优雅的一种方式,仓促之下没有说的太详细,后续会再修改修改,尽量配合实例更通俗易懂一点,希望大家能够有所收获!!!
- 作者:昊色居士
- 链接:https://blog.haose.love//article/7d94d0c0-7ae5-497c-a2af-07bb3b39e81b
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。