2016-07-21 61 views
1

我有一個在後端運行python的web應用程序。當我的頁面加載時,會調用一個運行SQL查詢的django函數,該查詢大約需要15-20秒才能運行並返回響應。每次頁面加載時都會發生這種情況,用戶每次刷新頁面時都會等待15-20秒,這非常煩人。Django:如何緩存一個函數

所以我想知道是否有一種方法來緩存來自查詢的響應,並在第一次加載頁面時將其存儲在瀏覽器的某個地方。每當頁面刷新後,而不是再次運行查詢,我只會從瀏覽器的緩存中獲取數據,因此頁面加載速度會更快。

這是一個運行在頁面加載時

def populateDropdown(request): 
    database = cx_Oracle.connect('username', 'password', 'host') 
    cur = database.cursor() 
    cur.execute("select distinct(item) from MY_TABLE") 
    dropList = list(cur) 
    dropList = simplejson.dumps({"dropList": dropList}) 
    return HttpResponse(dropList, content_type="application/json") 

我似乎無法找到如何做到這一點的例子功能。我查閱了關於緩存的Django文檔,但是它展示瞭如何緩存整個頁面而不是特定的功能。如果您可以提供一個簡單的示例或指向教程的鏈接,那將是非常棒的。謝謝:)

回答

2

您可以緩存認爲運行該查詢結果:

from django.views.decorators.cache import cache_page 

@cache_page(600) # 10 minutes 
def populateDropdown(request): 
    ... 

或高速緩存中,你的情況是幾乎同義緩存整個視圖的視圖昂貴的功能:

from django.core.cache import cache 

def populateDropdown(request): 
    if not cache.get('droplist'): # check if droplist has expired in cache 
     database = cx_Oracle.connect('username', 'password', 'host') 
     cur = database.cursor() 
     cur.execute("select distinct(item) from MY_TABLE") 
     dropList = list(cur) 
     dropList = simplejson.dumps({"dropList": dropList}) 
     cache.set('droplist', dropList, 600) # 10 minutes 
    return HttpResponse(cache.get('droplist'), content_type="application/json") 
+0

這工作就像魔術。這是完美的。非常感謝 :) –