Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在多个django应用程序中使用单例实例_Django_Import_Singleton_Metaclass - Fatal编程技术网

如何在多个django应用程序中使用单例实例

如何在多个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

我正在使用django框架创建一个网站。 我在一个django应用程序中使用了一个单例,我用它来存储一些变量。 现在我已经在我的项目中创建了另一个应用程序,如何将数据从我的singleton导入到新应用程序中

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