手写配置文件实现两套配置文件的切换

适用场景,当用户配置了自己的配置文件后,以用户的配置为准;用户不配置时,以系统的为准,避免程序因配置文件而出错!

这里我们仿照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,如此就完成了!!

 

posted @ 2019-03-12 12:14  cnblogs用户  阅读(503)  评论(0编辑  收藏  举报