• Python Day 71 Django框架setting源码分析、基于该源码原理实现用户在暴露的setting文件中自定义的配置就使用用户配置的,没配置就是用全局默认的


      ##Django框架setting源码分析

    ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"  #这个是全局大字典
    from django.conf import settings #第一步:查看django 全局setting源码入口
    
    class Settings(object): #第四步
        def __init__(self, settings_module):  # BBS.settings
            # update this dict from global settings (but only for ALL_CAPS settings)
            for setting in dir(global_settings):  # 拿到global_settings文件里面所有的变量名
                if setting.isupper():  # 配置文件中只能写大写的变量名
                    setattr(self, setting, getattr(global_settings, setting))  #通过反射给Settings类对象设置属性值,这些属性来自全局配置文件settings
            self.SETTINGS_MODULE = settings_module
    
            mod = importlib.import_module(self.SETTINGS_MODULE) #动态导入模块,传入的是字符串
            # from BBS import settings
            
             for setting in dir(mod):  # 获取暴露给用户settings配置中的变量名
                if setting.isupper():
                    setting_value = getattr(mod, setting)
                    setattr(self, setting, setting_value)  #通过反射给Settings类对象设置属性值,这些属性来自暴露给用户配置文件settings,利用字典的键存在与否 达到用户配置了用用户的,用户没配置用全局
    
        
    class LazySettings(LazyObject): #第三步:查看怎么实现过程
         def _setup(self, name=None):
            """
            Load the settings module pointed to by the environment variable. This
            is used the first time we need any settings at all, if the user has not
            previously configured the settings manually.
            """
            settings_module = os.environ.get(ENVIRONMENT_VARIABLE)  # 从全局大字典os.environ中获取一个键为ENVIRONMENT_VARIABLE对应的值,该值在哪里看呢?在
                                                                    #manage.py文件开头就能看到 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day72.settings")
            self._wrapped = Settings(settings_module)
    
    settings = LazySettings()   #第二步:新建一个对象

       ##基于该源码原理实现用户在暴露的setting文件中自定义的配置就使用用户配置的,没配置就是用全局默认的

    NAME = '用户自定义配置'
    用户自定义setting文件
    NAME = '全局默认配置'
    全局默认settings配置文件
    #第四步:导入全局配置
    import importlib
    
    from lib.conf import global_setting
    import os
    class Settings:
        #第三步
        def __init__(self):
            for name in dir(global_setting):
                if name.upper():
                    k = name #默认的配置文件中所有的变量名
                    v = getattr(global_setting,name) #默认的配置文件中所有的变量名所对应的值
                    setattr(self,k,v)#将项目默认的配置中所有的配置以键值对存入到settings对象中
            #从全局的大字典中获取暴露给用户的settings文件路径
            module_path = os.environ.get('xxx')
            #利用importlib模块传入字符串动态导入暴露用户自定义settings文件的模块名
            module = importlib.import_module(module_path)
            #从用户自定义settings文件中循环获取所有键值对,存入到该Settings类产生的对象settings中
            #达到用户配置就使用用配置的,用户没有配置就用全局的
            for name in dir(module):
                if name.upper():
                    k = name #用户自定义文件中所有的变量名
                    v = getattr(module,name) #用户自定义配置文件中所有的变量名所对应的值
                    setattr(self,k,v)
    settings=Settings()
    全局配置包中__init__.py文件
    import os
    import sys
    
    BASE_DIR = os.path.dirname(__file__)
    sys.path.append(BASE_DIR)
    #第一步:项目启动 设置全局大字典{'xxx':'conf.setting'}
    os.environ.setdefault('xxx','conf.setting')
    
    #第二步:lib目录conf是一个包 包下面有__init__模块
    from lib.conf import settings
    print(settings.NAME)  #打印结果 用户配置用用户的 用户没配置用全局的
    start.py测试文件

       ##补充一下importlib模块

    #方法一:
    # from conf.setting import name
    # print(name)
    #方法二
    import importlib
    res = 'conf.setting'
    mo=importlib.import_module(res)
    print(mo.name)
  • 相关阅读:
    linux下运行、停止jar包
    .net开发CAD2008无法调试的解决方法
    【转】C#获取当前程序运行路径的方法集合
    如何在arcmap中调试addin或者插件
    【转】WriteMessage的信息在AutoCAD中命令行中实时显示
    ArcGIS10的附件功能
    CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法
    [转]Tesseract 3.02中文字库训练
    Truncated incorrect DOUBLE value
    tomcat无故停止
  • 原文地址:https://www.cnblogs.com/liangzhenghong/p/11276782.html
Copyright © 2020-2023  润新知