一、 为什么要使用配置
如果我们在较复杂的项目中不使用配置文件,我们可能会面临下面的情况:
你决定更改你的项目中数据库的 host, 因为你要将项目从测试环境转移到实际的上产环境中。如果你的项目中多个位置用到了这个 host,那你不得不一个一个找到这些位置再修改成新的 host。花了半天,然后过了一天,你发现项目在生产环境有些问题,需要重新移回测试环境,你得再次修改,这样工作很繁琐很不优雅。
你开发了一个很棒的开源项目,你想将其放到版本控制系统例如github上,但是你服务器的主机的地址、账号、密码也都上传上去了,但是你没有意识到,直到有个 bad guy 拿到了你的信息,从你的服务器窃取信息、攻击你的服务器,让你产生了极大的损失。然后你想把程序改动一下,把涉密的信息比如地址密码都删掉,可是由于版本控制的原因,别人依然能看到你以前版本的代码。于是你不得不改掉你的账户、密码等,真的是个悲伤的开源项目经历。
但是,如果你使用了配置管理呢,那会有以下几个优点:
这样就提高了代码的重用性,不再每次都去修改代码内部
这意味着其他不太懂你代码内部的人也可以使用你的项目,只用根据需求更改配置即可
有利于团队协作
有利于安全数据/秘密数据的管理
二、Python 中进行配置管理的几种方式
由于使用 Python 较多,因此基于 Python 进行配置管理的相关说明,当然其他语言也都是大同小异,主要思想还是不变。
2.1 使用 Python 内置的数据结构(如字典)
2.1.1单个文件下的单个配置
我们很自然就能想到这一点,例如以下代码:
# main.py
import pymysql
DATABASE_CONFIG = {
"host":"localhost",
"dbname":"db",
"user":"user",
"password":"pwd",
"port":3306
}
def connect_db_do_something1(dbname):
if dbname != config.DATABASE_CONFIG["dbname"]:
raise ValueError("Couldn"t not find DB with given name")
conn = pymysql.connect(host=config.DATABASE_CONFIG["host"],
user=config.DATABASE_CONFIG["user"],
password=config.DATABASE_CONFIG["password"],
db=config.DATABASE_CONFIG["dbname"])
"""
do something 1
"""
def connect_db_do_something2(dbname):
if dbname != config.DATABASE_CONFIG["dbname"]:
raise ValueError("Couldn"t not find DB with given name")
conn = pymysql.connect(host=config.DATABASE_CONFIG["host"],
user=config.DATABASE_CONFIG["user"],
password=config.DATABASE_CONFIG["password"],
db=config.DATABASE_CONFIG["dbname"])
"""
do something 2
"""
connect_db_do_something1("db")
connect_db_do_something2("db")
在上面的代码中,我们可以看到,同一数据库配置,我们反复使用了两次,如果我们需要更改数据库相关的数据如password,我们不需要在两个方法内部修改,而是只用修改DATABASE_CONFIG字典中的相关值即可。和以前没有配置管理的时候相比,减少了太多的工作量了。
2.1.2多个文件下的单个配置
但是当你的项目开始变得复杂的时候,你的文件就不止一个这么简单了,这时候如果我需要在 main2.py 里面需要用 DATABASE_CONFIG 的时候就不是很方便了,因为如果直接 import main 的时候,虽然能够使用 main.DATABASE_CONFIG ,但同时 mian.py 中的
connect_db_do_something1("db")
connect_db_do_something2("db")
也被执行了,这可不是我们想看到的,因此我们有了新的需求,能在同一个项目下的不同文件里简单快速的导入我们的数据库配置 DATABASE_CONFIG,于是我们想出了下面的方法来解决这个问题:
# config.py
DATABASE_CONFIG = {
"host": "localhost",
"dbname": "db",
"user": "user",
"password": "pwd",
"port": 3306