Python 在django视图/全局对象之间共享对象

Python 在django视图/全局对象之间共享对象,python,django,Python,Django,在Django中,我通常希望在启动时创建和配置一些对象,并使其在任何地方都可用。例如,第三方API客户端 因此,当django开始时,我想这样做: from some.thirdparty import ThirdPartyClient from django.conf import settings ... my_thirdparty_client = ThirdPartyClient(configstring=settings.SOME_CONFIG_ITEM) from somewher

在Django中,我通常希望在启动时创建和配置一些对象,并使其在任何地方都可用。例如,第三方API客户端

因此,当django开始时,我想这样做:

from some.thirdparty import ThirdPartyClient
from django.conf import settings
...
my_thirdparty_client = ThirdPartyClient(configstring=settings.SOME_CONFIG_ITEM)
from somewhere import my_thirdparty_client

def whatever(request):
    my_thirdparty_client.do_stuff()
    my_thirdparty_client.do_even_more_stuff()
然后在某个地方的视图中,我想这样做:

from some.thirdparty import ThirdPartyClient
from django.conf import settings
...
my_thirdparty_client = ThirdPartyClient(configstring=settings.SOME_CONFIG_ITEM)
from somewhere import my_thirdparty_client

def whatever(request):
    my_thirdparty_client.do_stuff()
    my_thirdparty_client.do_even_more_stuff()
显然,我知道我可以在视图开始时实例化客户机,但是如果初始化实例的成本很高,我不想在每个请求上都这样做

我想在视图之间共享这些类型的对象,Django的惯用方法是什么

我想在视图之间共享这些类型的对象,Django的惯用方法是什么

Django与此问题无关。
您只需要使用名为-

我更喜欢使用元类在Python中实现此模式
,但也有其他方法

class SingletonMetaclass(type):

    _instance = None

    def __call__(cls, *args, **kwargs):
        assert not (args or kwargs), 'Singleton should not accept arguments'

        if isinstance(cls._instance, cls):
            return cls._instance
        else:
            cls._instance = super(SingletonMetaclass, cls).__call__()
            return cls._instance


class ThirdPartyClient(metaclass=SingletonMetaclass):

    def __init__(self):
        self.configstring = settings.SOME_CONFIG_ITEM
为了初始化客户端,您可以使用方法。

当您的Django应用程序准备好使用时,它将只运行一次。

为什么不在视图文件的顶部创建一个全局对象?@xyres我想我正在寻找半官方的方法来完成它(这对其他开发人员来说是最不奇怪的),谢谢您的时间。是的,它需要是一个singleton,但我需要把它的名字放在某个地方,因为我无法访问提供客户端的第三方库,我必须创建它的singleton子类-很好-但是我应该在哪里定义它?在特定的django应用程序中?我应该制作一个包含所有单身人士的应用程序吗?Flask通过它的“扩展”来处理这个问题,我想知道django开发人员希望在哪里找到这些对象。@jsj“我必须为它创建一个单例子类”这不是必需的。您可以在
ready
方法中初始化实例并将其分配到某个位置。之后,您可以导入一个函数,该函数将知道如何返回该实例。“我应该在哪里定义它?在特定的django应用程序中?”您可以在根应用程序的(项目)中初始化实例方法
ready
,正如我在回答中提供的那样。@jsj但是如果你有一些特定的django应用程序,并且这个客户端属于它,那么只需在这个特定的django应用程序的方法
ready
@jsj中初始化它,而不是说谢谢,将我的回答标记为一个解决方案,以向其他开发人员展示它。