2016-11-17 44 views
0

我是比較新的Django的&學習它逐位。 我訂閱了一個服務,它使用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放入緩存中會返回一個錯誤,指出它不能放入緩存中。

有哪些替代方案來解決我的問題呢?

回答

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() 

現在通過其他方式訪問此客戶端R模塊:

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

將'Dispatch'對象加載到'_setup'中會更簡單嗎? –

+0

@JF多數民衆贊成我前面所做的,但問題是調度對象定義'initCmd'這就需要偷懶了'LazyObject'工作在默認的'__init__'(當然上面的代碼可以得到改善,但在這就是我只有時刻在我看來) –

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) 
+0

您能否解釋一下「將代碼放在模塊的頂層?」?我嘗試了一個測試模塊,其中我編寫了一個init(),用於初始化zk並將模塊導入模塊中,該模塊必須頻繁訪問數據,在一個請求中調用init,然後在另一個請求中嘗試訪問數據zk,它返回了我聲明的None類型,不給我以前初始化的zk引用。 – Shariq