python项目的配置方式

举报
芥末拌个饭吧 发表于 2022/11/11 09:55:55 2022/11/11
【摘要】 说到 python 项目的配置方式,我们有很多种实现方式。每种方式都有各自的特点,在我们实际开发中,需要根据自身需要选择合适的配置方式。下面我们来介绍常用的几种配置方式。

前言

说到 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()

需要用到配置时,比如要用log_path,就直接调用conf.log_path即可。

总结

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

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

大家的项目配置都是怎样的呢?欢迎在评论区讨论。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。