Django的override_settings修饰器浅析

本文主要分析了Django的override_settings修饰器,探讨了Settings、LazySettings和UserSettingsHolder类的功能,以及修饰器在类和函数上的应用。override_settings用于在特定作用域内临时修改Django的配置,它利用Python的上下文管理器实现配置的修改和还原。
摘要由CSDN通过智能技术生成
  1. Django的Settings模块代码说明
  2. Django的override_settings修饰器分析

前言

前两天刚刚看了Django settings的实现,今天又发现了测试工具中有个override_settings修饰器,于是就想从它下手来分析一下Django的settings

本篇文章主要分析的是override_settings作为修饰器的实现,其作为上下文管理器的部分并未详细分析。

Django的settings说明

在分析这个修饰器之前,我们先来了解一下Django的settings是如何实现的, Django的settings的代码存放在django/conf/__init__.py中,其中主要有三个类,LazySettingsSettingsUserSettingsHolder

Settings

Settings类实现了Django配置的载入和存储功能,在它的__init__函数中,首先从django/conf/global_settings.py文件中导入Django默认的配置,然后再从DJANGO_SETTINGS_MODULE环境变量所指定的配置文件中导入我们项目自定义的配置,然后逐项地检查并添加配置。

需要注意的是,Settings会把我们自定义的配置的名称存放到Settings._explicit_settings集合中,Settings.is_overriden函数就是通过检查Settings._explicit_settings集合,来查看某项配置是否被我们自定义的配置给覆盖掉了。

LazySettings

LazySettingsSettings类的一个代理,或者可以认为是对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构造函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值