我有一个只运行一次的类,这在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
这当前有效,但是我只想在服务器启动时加载模块,而不是在进行迁移时加载。感谢任何提示/建议。
答案 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
对象。构建完成后,将不会再次创建对象。
因此,如果仅通过解释文件(因此仅通过调用函数和其他延续)来获取属性(不是),则我们是安全的。