为什么Django的设置对象一个LazyObject?(Why is django's se

2019-06-25 20:07发布

展望django.conf我注意到,设置是这样实现的:

class LazySettings(LazyObject):     
...

什么是背后进行设置对象懒的理?

Answer 1:

看看本节 Django的编码风格。 究其原因是在那里解释(下面引用)。

除了性能,进口时的第三方模块可以修改设置。 访问设置应延迟,以确保此配置首先发生。

模块不应该在存储在在顶层django.conf.settings一般使用的设置(即,当模块被导入的评价)。 对此的解释如下:

的设置的手动配置(即,不依赖于环境DJANGO_SETTINGS_MODULE变量)是允许的,可能如下:

 from django.conf import settings 

settings.configure({},SOME_SETTING =“富”)然而,如果任何设置在settings.configure行之前访问,这将无法工作。 (在内部,设置是自动进行配置时,如果尚未配置它被访问的设置一个LazyObject)。

所以,如果有一个包含一些代码如下模块:

 from django.conf import settings from django.core.urlresolvers import get_callable default_foo_view = get_callable(settings.FOO_EXAMPLE_VIEW) 

......然后导入此模块将导致配置的设置对象。 这意味着,导入模块在最顶层的能力的第三方是配置设置手动对象的能力不兼容,或使得在某些情况下非常困难。

代替上面的代码,懒惰或间接层必须使用,如django.utils.functional.LazyObjectdjango.utils.functional.lazy()lambda



Answer 2:

它的抽象实际的设置文件,使得它重量轻,直到你真正进入你想设置的代理对象。 一旦你开始访问的属性,它就会按需加载。 我们的想法是,直到你需要它们,以减少负载设置的开销。



Answer 3:

我认为,这样做的目的是为了简化从一个开发点设置。 因此,每个项目都可以有自己的settings.py文件,而不必需要定义所有其他Django的设置以及。 该LazySettings包装形式的组合一切从Django的global_settings.py和本地设置。 它可以让开发者决定他要改写,这是他要保持他要添加的默认值或者什么设置。

LazySettings类是也许对这个错误的名称,因为我觉得它是不是真的懒惰。 一旦你这样做from django.conf import settings整个设置的对象在范围之内。



文章来源: Why is django's settings object a LazyObject?