如何在多个 django 应用程序中使用单例实例
Posted
技术标签:
【中文标题】如何在多个 django 应用程序中使用单例实例【英文标题】:how to use a singleton instance in multiple django apps 【发布时间】:2021-08-08 19:18:41 【问题描述】:我正在使用 django 框架创建一个网站。 我在一个 django 应用程序中使用单例,并使用它来存储一些变量。 现在我已经在我的项目中创建了另一个应用程序,如何将数据从我的单例导入到新应用程序中。
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、...)的情况下的样子
Project
Description
-views.py
Transformation
-views.py
【问题讨论】:
【参考方案1】:第一件事:单身人士不需要元类 - 只需这样做:
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 的人都只会获得它所创建的唯一实例,这种微不足道的事情不需要元类黑魔法。
现在,请回答您的问题,MyClass
单个实例将可用于您的项目,就像任何其他命名的 Python 对象一样 - 只需使用其他应用程序中的合格导入语句即可,例如:
from project.transformation.views import MyClass
现在,请注意一件事:在生产环境中,django 项目可以有多进程工作人员 - 在这种情况下,每个工作人员都有一个单独的实例。 (如果您的生产 WSGI 服务器配置为仅使用多线程,您将获得一个实例)。
在这种情况下,如果您真的想在所有工作人员之间共享“myclass”中的所有属性,您需要一个更复杂的设置,结合属性和多进程数据通信原语,如multiprocessing.Value
。
而且,如果您的生产设置将用于水平扩展,并且在不同的服务器中处理进程,那将无法正常工作 - 您将需要设置一个键/值服务(如 redis 实例)以在所有工作人员之间同步这些属性。
【讨论】:
以上是关于如何在多个 django 应用程序中使用单例实例的主要内容,如果未能解决你的问题,请参考以下文章