django中的全球可用对象,用于频繁访问

时间:2016-11-17 14:24:14

标签: python django caching

我对Django& amp;一点一点地学习它。 我订阅了一项服务,该服务使用DLL来提供我需要的数据。
要从服务中获取所需的数据,我必须进行一些初始化;代码需要大约2-3秒(需要调度DLL,然后按如下方式进行初始化调用:)

from win32com.client import Dispatch
#pythoncom.CoInitialize()
zk = Dispatch("easyconnect.serverside")
print(zk.cmdInit(MY_ID, MY_PASS, SERVER_IP)) 

我需要全局使用zk对象到所有其他模块,这样我就不必模糊地执行init并加快数据访问过程。
我尝试了 Django的缓存框架,这有助于缓存整个网站或网页,但我认为这不是我想要的。另外,将zk放入缓存会返回一个错误,指出它无法放入缓存中。

有什么方法可以解决我的问题?

2 个答案:

答案 0 :(得分:0)

是的,你可以全局定义你的客户端并访问其他模块,但问题是这个客户端会在加载应用程序后立即初始化但我们不希望在应用程序加载期间这个额外的连接时间我们只想启动一个客户端当我们需要它而且只需要一次因此你需要django.utils.functional.LazyObject(另一个类的包装器,可以用来延迟包装类的实例化)

clients.py (让我们创建一个懒惰的客户端)

from django.utils.functional import LazyObject
from django.conf import settings

from win32com.client import Dispatch


class EasyConnect:
    def __init__(self):
        self.easy_connect = Dispatch('easyconnect.serverside')
        self.easy_connect.cmdInit(
            settings.EASSYCONNECT_ID,
            settings.EASSYCONNECT_PASS,
            settings.EASSYCONNECT_IP
        )


class EasyConnectClient(LazyObject):
    def _setup(self):
        self._wrapped = EasyConnect()

client = EasyConnectClient()

现在从其他模块访问此客户端:

from clients import client
client.easy_connect.make_request()  # make_request is just dummy method, use actual method

答案 1 :(得分:0)

只需将初始化代码放在模块的顶层 - 使zk对象成为全局模块 - 然后从您需要的位置导入它。初始化代码仅在第一次导入时每个进程执行一次。如果您想确保在任何请求之前执行此代码,请将其放入您的某个模型模块中(或从您的某个模型中导入)

示例(Q& D):

# myapp/client.py
from win32com.client import Dispatch
from django.conf import settings

def init():
    #pythoncom.CoInitialize()
    zk = Dispatch("easyconnect.serverside")
    zk.cmdInit(settings.MY_ID, settings.MY_PASS, settings.SERVER_IP)
    return zk

connection = init() 

然后

# myapp/models.py    
# ...
from myapp import client

# ...
def do_something(*args, **kw):
    return client.connection.some_method(*args, **kw)