手写配置文件实现两套配置文件的切换
适用场景,当用户配置了自己的配置文件后,以用户的配置为准;用户不配置时,以系统的为准,避免程序因配置文件而出错!
这里我们仿照Django的源码思想来实现!
django源码
一般我们导入的settings配置文件都是自己创建Django项目时自动生成的那个文件,这样我们就只能使用这一个文件中的配置
from restful import settings # restful 就是我们创建的项目名
但其实在Django中还有一个叫settings的配置文件,它是一个全局的配置,当我们导入这个settings后,既可以使用Django的默认配置,还可以用自定义的配置,或覆盖Django的默认配置!
from django.conf import settings
首先大致看一下Django的源码实现过程,点击settings后进到文件中,会看到它实例化了LazySettings这个类!
再看Settings里,做了什么?
这样简单理解后,我们自己也可手写一个配置文件,以后可以直接拷贝使用!
自己手写
首先,创建出目录结构,如下:
OK!开始写代码实现该功能
Setting类的__init__.py文件
# -*- coding:utf-8 -*- import os import importlib from . import global_setting class Setting: def __init__(self): # 查找配置时先找系统配置 # 循环系统的默认配置,将配置文件的变量赋值给self for settings in dir(global_setting): if settings.isupper(): setattr(self, settings, getattr(global_setting, settings)) # 再找用户自定义的配置 # 从环境变量取出用户自定义配置,并拿到路径里的py文件 mod = importlib.import_module(os.environ.get('USER_SETTING')) # 循环用户自定义配置,将配置文件的变量赋值给self for settings in dir(mod): if settings.isupper(): setattr(self, settings, getattr(mod, settings)) setting = Setting()
test.py文件
# -*- coding:utf-8 -*- import os # 在导入setting之前要将用户自定义配置文件添加到环境变量中 os.environ.setdefault('USER_SETTING', 'user_setting.settings') if __name__ == '__main__':
# 导入系统的配置文件 from conf import setting print(setting.DEBUG)
global_setting.py文件
DEBUG = False
settings.py文件
DEBUG = True
执行test.py文件的结果,还在终端显示True,如果将settings.py中的DEBUG注释,在执行test.py终端将会显示False,如此就完成了!!
本文来自博客园,仅供参考学习,如有不当之处还望不吝赐教,不胜感激!转载请注明原文链接:https://www.cnblogs.com/rong-z/p/10515888.html
作者:cnblogs用户