- Django的Settings模块代码说明
- Django的
override_settings
修饰器分析
前言
前两天刚刚看了Django settings的实现,今天又发现了测试工具中有个override_settings
修饰器,于是就想从它下手来分析一下Django的settings
。
本篇文章主要分析的是override_settings
作为修饰器的实现,其作为上下文管理器的部分并未详细分析。
Django的settings说明
在分析这个修饰器之前,我们先来了解一下Django的settings
是如何实现的, Django的settings
的代码存放在django/conf/__init__.py
中,其中主要有三个类,LazySettings
,Settings
和UserSettingsHolder
。
Settings
Settings
类实现了Django配置的载入和存储功能,在它的__init__
函数中,首先从django/conf/global_settings.py
文件中导入Django默认的配置,然后再从DJANGO_SETTINGS_MODULE
环境变量所指定的配置文件中导入我们项目自定义的配置,然后逐项地检查并添加配置。
需要注意的是,Settings
会把我们自定义的配置的名称存放到Settings._explicit_settings
集合中,Settings.is_overriden
函数就是通过检查Settings._explicit_settings
集合,来查看某项配置是否被我们自定义的配置给覆盖掉了。
LazySettings
LazySettings
是Settings
类的一个代理,或者可以认为是对Settings
的一层包裹,它的主要功能就是Lazy
,或者叫做懒载入。它把Settings
类的实例存放在它的私有变量_wrapped
中,初始化的时候,它默认将_wrapped
设置为空,只有当从LazySettings
中取值的时候(会调用LazySettings.__getattr__
函数),它才会调用_setup
函数,实例化一个Settings
对象,并从中取出对应的配置项。
我们平常在代码中使用的django.conf.settings
对象,就是这个类的实例。
UserSettingsHolder
UserSettingsHolder
类和上面两个类有些不同,它也是用来存储用户的配置项的,只不过它并不会从django/conf/global_settings.py
文件中读取Django默认的配置,它只是单纯地将用户传入的配置存储起来,以供读取。
def __init__(self, default_settings):
"""
Requests for configuration variables not in this class are satisfied
from the module specified in default_settings (if possible).
"""
self.__dict__['_deleted'] = set()
self.default_settings = default_settings
上面就是UserSettingsHolder
构造函数