如何在多个django应用程序中使用单例实例
我正在使用django框架创建一个网站。 我在一个django应用程序中使用了一个单例,我用它来存储一些变量。 现在我已经在我的项目中创建了另一个应用程序,如何将数据从我的singleton导入到新应用程序中如何在多个django应用程序中使用单例实例,django,import,singleton,metaclass,Django,Import,Singleton,Metaclass,我正在使用django框架创建一个网站。 我在一个django应用程序中使用了一个单例,我用它来存储一些变量。 现在我已经在我的项目中创建了另一个应用程序,如何将数据从我的singleton导入到新应用程序中 class SingleInstanceMetaClass(type): def __init__(self, name, bases, dic): self.__single_instance = None super().__init__(nam
class SingleInstanceMetaClass(type):
def __init__(self, name, bases, dic):
self.__single_instance = None
super().__init__(name, bases, dic)
def __call__(cls, *args, **kwargs):
if cls.__single_instance:
return cls.__single_instance
single_obj = cls.__new__(cls)
single_obj.__init__(*args, **kwargs)
cls.__single_instance = single_obj
return single_obj
class MyClass(metaclass=SingleInstanceMetaClass):
def __init__(self):
self.df = None
self.del_var = None
self.quali_col = None
self.quanti_col = None
self.target_var = None
self.date_col = None
这就是我的项目在没有其他django文件(模型、URL等)的情况下的样子
First thngs First:单例不需要元类-只需执行以下操作:
class MyClass(metaclass=SingleInstanceMetaClass):
def __init__(self):
self.df = None
self.del_var = None
self.quali_col = None
self.quanti_col = None
self.target_var = None
self.date_col = None
def __call__(self):
return self
MyClass = MyClass()
这将创建一个实例,并通过删除对类的引用:任何试图导入或使用MyClass的人都只能访问它所创建的唯一实例,这样一件小事不需要元类balckmagic
现在,对于您的问题,MyClass
单个实例将以与任何其他命名Python对象相同的方式对您的项目可用-只需使用其他应用程序中的合格导入语句即可访问它,如:
from project.transformation.views import MyClass
现在,请注意一件事:在生产环境中,django项目可以有多个进程工作进程——在这种情况下,每个工作进程将有一个单独的实例。(如果生产WSGI服务器配置为仅使用多线程,则将获得一个实例)
在这种情况下,如果您真的希望在所有工作人员之间共享“myclass”中的所有属性,则需要更复杂的设置,将属性和多进程数据通信原语(如multiprocessing.Value
)结合起来
如果您的生产设置将在不同的服务器中进行水平扩展,那么这将不起作用-您需要设置一个键/值服务,如redis实例,以便在所有工作人员之间同步这些属性
from project.transformation.views import MyClass