博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django源码笔记——settings加载
阅读量:5787 次
发布时间:2019-06-18

本文共 3293 字,大约阅读时间需要 10 分钟。

hot3.png

settings对象

通常要获取settings的配置项时候都会通过from django.conf import settings获取。

settings是一个LazySettings实例对象,在django.conf的__init__.py下settings = LazySettings(),由于模块本身只执行一次所以这是一个单例(简单说就是你每次导入的settings都是同一个实例对象)

参考:

class LazySettings(LazyObject)

class LazySettings(LazyObject):    def _setup(self, name=None):        # 根据配置的settings文件导入配置        settings_module = os.environ.get(ENVIRONMENT_VARIABLE)        pass        self._wrapped = Settings(settings_module)     # 和下面的UserSettingsHolder一样都是BaseSettings子类    def __getattr__(self, name):        # 获取属性时候没有导入配置则导入        if self._wrapped is empty:            self._setup(name)        return getattr(self._wrapped, name)    def configure(self, default_settings=global_settings, **options):        # 手动自定义配置,没有配置才能使用        if self._wrapped is not empty:            raise RuntimeError('Settings already configured.')        holder = UserSettingsHolder(default_settings)    # 和上面的Settings一样都是BaseSettings子类        for name, value in options.items():            setattr(holder, name, value)        self._wrapped = holder                @property    def configured(self):        return self._wrapped is not empty

父类LazyObject中很多类似__getattr__ = new_method_proxy(getattr)的使用,没有配置时候先导入配置 ,然后获取self._wrapped配置中的信息和属性

相当于:__getattr__ = getattr(self,_wrapped, *args)

def new_method_proxy(func):    def inner(self, *args):        if self._wrapped is empty:            self._setup()        return func(self._wrapped, *args)    return inner

测试

In [7]: dir(settings)Out[7]:['ABSOLUTE_URL_OVERRIDES', 'ADMINS', 'ALLOWED_HOSTS', 'ALLOWED_INCLUDE_ROOTS',# 省略...

总结:LazySettings主要用于控制配置文件的来源

class Settings

实际上配置文件的配置都在Settings中, 配置文件中的配置(必须全部大写)都添加为Settings实例的属性。UserSettingsHolder中配置都在LazySettings中手动循环添加,这里不在赘述,下面只看Settings导入配置过程

class BaseSettings(object):    """    Common logic for settings whether set by a module or by the user.    """    def __setattr__(self, name, value):        # "MEDIA_URL", "STATIC_URL"两项配置必须以"/"结尾        if name in ("MEDIA_URL", "STATIC_URL") and value and not value.endswith('/'):            raise ImproperlyConfigured("If set, %s must end with a slash" % name)        object.__setattr__(self, name, value)
class Settings(BaseSettings):    def __init__(self, settings_module):        # 配置项必须为全大写        for setting in dir(global_settings):    # 导入默认配置文件的配置,即初始化配置            if setting.isupper():                setattr(self, setting, getattr(global_settings, setting))        # store the settings module in case someone later cares        self.SETTINGS_MODULE = settings_module        mod = importlib.import_module(self.SETTINGS_MODULE)        # import指定的配置文件        self._explicit_settings = set()        for setting in dir(mod):        # 导入配置指定配置文件中的配置项覆盖默认配置            if setting.isupper():                setting_value = getattr(mod, setting)                pass                setattr(self, setting, setting_value)                self._explicit_settings.add(setting)            pass        def is_overridden(self, setting):        return setting in self._explicit_settings

现在settings中已经有所有的配置项

conf包

|- conf|--- app_template            # app目录模板:manage.py startapp|--- locale                        # 语言包和对应时间表示格式|--- project_template        # app项目模板 :manage.py startproject|--- urls

转载于:https://my.oschina.net/watcher/blog/823346

你可能感兴趣的文章
android超链接
查看>>
统计数据库大小
查看>>
第十六章:脚本化HTTP
查看>>
EXCEL表中如何让数值变成万元或亿元
查看>>
编写高性能的java程序
查看>>
L104
查看>>
带三角的面包屑导航栏(新增递增数字)
查看>>
用javascript获取地址栏参数
查看>>
一起谈.NET技术,你应该知道的15个Silverlight诀窍
查看>>
商教助手!解析夏普液晶高清宽屏投影机系列
查看>>
云南去年有望实现151万贫困人口净脱贫
查看>>
Java架构师面试题系列整理(大全)
查看>>
延伸产业链 中国产粮大省向“精深”问发展
查看>>
消费贷用户70%月收入低于5000元 80、90后是主要人群
查看>>
2018年内蒙古外贸首次突破1000亿元
查看>>
CTOR有助于BCH石墨烯技术更上一层楼
查看>>
被遗忘的CSS
查看>>
Webpack中的sourcemap以及如何在生产和开发环境中合理的设置sourcemap的类型
查看>>
做完小程序项目、老板给我加了6k薪资~
查看>>
java工程师linux命令,这篇文章就够了
查看>>