写点什么

python 工程化配置方式

  • 2022 年 8 月 11 日
    广东
  • 本文字数:1576 字

    阅读完需:约 5 分钟

前言

说到 python 项目的配置方式,我们有很多种实现方式。每种方式都有各自的特点,在我们实际开发中,需要根据自身需要选择合适的配置方式。下面我们来介绍常用的几种配置方式。

一、在项目文件中编写配置

这种方式在小型项目中运用最广,因为实现和管理都非常方便,但在安全性上就较差了。在非正式或者对安全性要求不高的项目中推荐使用。

通常在项目根目录中建立配置文件 config.py,代码示例如下:

# encoding:utf-8
class BaseConfig(): DEBUG = False
class TestConfig(BaseConfig): DEBUG = True MYSQL_HOST = "xxx" class ProdConfig(BaseConfig): DEBUG = True MYSQL_HOST = "yyy" confs = { 'test': TestConfig, 'prod': ProdConfig}
# 根据服务器环境变量来选择相应环境ENV = os.getenv('project_env', "test")conf = confs[ENV]
复制代码

注意:代码的倒数第二行是通过预先在服务器设定的环境变量来确定具体环境。python 给服务器设定环境变量方法:os.environ['环境变量名称']='环境变量值'


二、在项目外存配置文件,使用 configparse 解析

第一种方式简单但安全性差,通常正式的工程代码更多会选择这种配置方式。配置文件脱离于代码,由负责人和运维共同维护。开发人员只需在代码中解析预设好的配置字段即可。

这种方式安全,但开发维护起来麻烦些。比如需要更新或增加配置,都需要联系负责人来处理。不过比起项目安全来,这种牺牲是值得的。

配置文件示例(这里我们用.conf 文件,也可用.ini 或者.json 等):

  1. 用一个文件来区分测试还是正式环境:

# app.conf[app]app = prod
复制代码
  1. 具体配置文件:

# app-prod.conf
[log_file]log_path = xxx
[mysql]host = yyy
复制代码


  1. 项目解析代码:

import configparser  # python3
class ConfigParse(object):
def getFilePath(self, name=""): from os import path d = path.dirname(__file__) if name == "": newpath = "xxx/app.conf" # 配置文件路径 else: newpath = "xxx/app-{0}.conf".format(name) # 配置文件路径 p = d.replace("/confs", newpath) return p
def getFileName(self): p = self.getFilePath() cf = configparser.ConfigParser() # python3 cf.read(p) name = cf.get("app", "app") return name
def save(self): name = self.getFileName() path = self.getFilePath(name) cf = configparser.ConfigParser() # python3 print(path) cf.read(path) self.cf = cf
def parse(self, section, key): return self.cf.get(section, key).replace("`", "").replace("\"", "")
def MustString(self, section, key, default): item = self.parse(section, key) if self.parse( section, key) else default return item
def MustInt(self, section, key): item = self.parse(section, key) return int(item)
def MustBool(self, section, key): item = self.parse(section, key) if item == "True": return True else: return False class Config(object): parse = ConfigParse() parse.save() # 开始解析配置 log_path = parse.parse("logfile", "log_path") ... conf = Config()
复制代码

总结

除了以上 2 种常见的配置方式,也有直接将配置写到系统环境变量中、Redis 存储配置等。还有就是在 github 中发现有使用 dyanconf 来读取配置的,方式类似于第二种。

我们在选择配置方式时,最重要的还是结合实际要求来确定。安全性要求高的,一般都会代码与配置分离,保证配置信息不被泄漏。


用户头像

还未添加个人签名 2020.06.16 加入

还未添加个人简介

评论

发布
暂无评论
python工程化配置方式_8月月更_芥末拌个饭吧_InfoQ写作社区