zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    聚美优品面试题
    前端开发常用的网站
    JS 正则表达式大全
    软件工程作业二
    大三个人简述
    2019期末总结
    2019春第一次课程设计实验报告
    2019第十二周作业
    2019第十一周作业
    2019第十周作业
  • 原文地址:https://www.cnblogs.com/liangzhenghong/p/11276782.html
Copyright © 2011-2022 走看看