如何一次实例化一个类并在视图中访问它

时间:2019-01-27 16:34:41

标签: django

我有一个只运行一次的类,这在myapp/__init__.py中有过,但是每次django启动时,它都会运行两次。当我不需要模型时,它也会在我迁移模型时运行。

我已经了解了 ready 函数https://docs.djangoproject.com/en/dev/ref/applications/#django.apps.AppConfig.ready,但是无法访问apps.py之外的实例化类。

这是我当前的工作流程: 在 init .py中:

from .my_module import ResourceHeavyClass
resource_heavy_instance = ResourceHeavyClass()

在我的views.py

from . import resource_heavy_instance

这当前有效,但是我只想在服务器启动时加载模块,而不是在进行迁移时加载。感谢任何提示/建议。

1 个答案:

答案 0 :(得分:1)

您可以使用SimpleLazyObject来推迟创建,直到您真正需要它为止。例如:

from .my_module import ResourceHeavyClass
from django.utils.functional import SimpleLazyObject

class SomeClass:

    resource_heave_instance = SimpleLazyObject(ResourceHeavyClass)

现在,只要您提取SomeClass.resource_heave_instance,它就不会创建ResourceHeavyClass

因此,例如,如果您有一个方法,则可以像这样使用它:

def some_method():
    resource_heave_instance = SomeClass.resource_heave_instance

因此,在这里,当您调用 some_method时,它将获取属性,并且确实会构造该对象。但是,只要不提取该属性,就不会创建ResourceHeavyClass对象。构建完成后,将不会再次创建对象。

因此,如果仅通过解释文件(因此仅通过调用函数和其他延续)来获取属性(不是),则我们是安全的。