如何做好python项目的配置分离
引用原地址:https://www.jianshu.com/p/aa6366b02c28
本文内容:
项目配置分离
- 为什么要分离
- 该怎么分离
配置合并
- 合并代码
分离
为什么要分离:
为区分正式和开发而分离
1.开发环境和生成环境应该使用不同的环境变量
为了隔离敏感信息而分离
1.数据库密码,账号token不应该存在代码里面
为了方便程序员写代码分离
1.独立公共的配置
如何做分离
代码目录结构
config/ __init__.py common.yml dev.yml prod.yml
common.yml
存放公共的配置
authorize: { token: justtoken, expire_time: 1200, reset_password_expire_time: 2400 } date_format: '%Y-%m-%d %H:%M:%S'
-
dev.yml
存放开发环境配置
db: { SQLALCHEMY_DATABASE_URI: "mysql+pymysql://admin@localhost:3306/test?charset=utf8mb4" }
prod.yml
存放正式环境的配置
db: { SQLALCHEMY_DATABASE_URI: "mysql+pymysql://admin@xxx:3306/prod?charset=utf8mb4" }
_init_.py 存放提取环境标量的代码
export database_password="hello"
合并
合并的代码:
import os import yaml env = os.environ.get('env', 'dev') def load_env(env_file_name): file = open(os.path.join(os.path.dirname(__file__), env_file_name), 'r', encoding='utf-8') cfg = yaml.safe_load(file) return cfg def merge_conf(base, to_be_merged): for i in to_be_merged.keys(): base[i] = to_be_merged[i] return base def load_env_outside(): env_conf = dict() env_conf['database_password'] = os.environ.get('database_password') return env_conf CONF = load_env('common.yml') if env == 'dev': dev_conf = load_env('dev.yml') CONF = merge_conf(CONF, dev_conf) elif env == 'prod': prod_conf = load_env('prod.yml') CONF = merge_conf(CONF, prod_conf) env_outside = load_env_outside() CONF = merge_conf(CONF, env_outside) else: raise EnvironmentError('Environment error') print(CONF)
执行结果:
{'authorize': {'token': 'justtoken', 'expire_time': 1200, 'reset_password_expire_time': 2400}, 'date_format': '%Y-%m-%d %H:%M:%S', 'db': {'SQLALCHEMY_DATABASE_URI': 'mysql+pymysql://admin@xxx:3306/prod?charset=utf8mb4'}, 'database_password': 'hello'}