14

查看 django.conf 我注意到设置是这样实现的:

class LazySettings(LazyObject):     
...

使设置对象变得懒惰的原因是什么?

4

3 回答 3

17

查看Django 编码风格的这一部分。原因在那里解释(引用如下)。

除了性能之外,第三方模块可以在导入时修改设置。应延迟访问设置以确保首先发生此配置。

模块通常不应使用存储在顶层 django.conf.settings 中的设置(即在导入模块时评估)。对此的解释如下:

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

from django.conf import settings

settings.configure({}, SOME_SETTING='foo')

但是,如果在 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

于 2013-01-09T02:16:07.567 回答
5

它是抽象实际设置文件的代理对象,并使其轻量级,直到您实际访问所需的设置。一旦您开始访问属性,它将按需加载。这个想法是减少加载设置的开销,直到您需要它们。

于 2012-06-28T05:36:36.583 回答
-2

我认为目的是从开发人员的角度简化设置。因此,每个项目都可以拥有自己的 settings.py 文件,而无需定义所有其他 Django 设置。LazySettings包装器类型结合了 Django global_settings.py 和您的本地设置中的所有内容。它让开发人员可以决定他想要覆盖哪些设置、他想要保留默认设置或者他想要添加哪些设置。

这个LazySettings类可能是一个错误的名字,因为我认为它并不是真的懒惰。一旦你做了类似from django.conf import settings整个设置对象在你的范围内的事情。

于 2012-06-28T07:05:52.273 回答