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 等):
- 用一个文件来区分测试还是正式环境:
# app.conf
[app]
app = prod
- 具体配置文件:
# app-prod.conf
[log_file]
log_path = xxx
[mysql]
host = yyy
- 项目解析代码:
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 来读取配置的,方式类似于第二种。
我们在选择配置方式时,最重要的还是结合实际要求来确定。安全性要求高的,一般都会代码与配置分离,保证配置信息不被泄漏。
大家的项目配置都是怎样的呢?欢迎在评论区讨论。
- 点赞
- 收藏
- 关注作者
评论(0)