2016-07-21 8 views
1

Ich habe eine Webanwendung, die Python im Backend ausführt. Wenn meine Seite geladen wird, wird eine Django-Funktion aufgerufen, die eine SQL-Abfrage ausführt, und diese Abfrage dauert ungefähr 15-20 Sekunden, um die Antwort auszuführen und zurückzugeben. Und das passiert jedes Mal, wenn die Seite geladen wird, und es wäre sehr ärgerlich für den Benutzer, jedes Mal 15-20 Sekunden zu warten, wenn die Seite aktualisiert wird.Django: wie man eine Funktion zwischenspeichert

Also wollte ich wissen, ob es eine Möglichkeit gibt, die Antwort von der Abfrage zwischenzuspeichern und irgendwo im Browser zu speichern, wenn die Seite das erste Mal geladen wird. Und wann immer die Seite später aktualisiert wird, anstatt die Abfrage erneut auszuführen, würde ich nur die Daten aus dem Cache des Browsers abrufen und so würde die Seite schneller geladen werden.

Dies ist die Funktion, die ausgeführt wird, wenn die Seite geladen wird

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

ich nicht ein Beispiel zu finden, wie dies zu tun scheinen. Ich habe Djangos Dokumentation zum Caching nachgeschlagen, aber es zeigt, wie man die ganze Seite im Cache speichert, nicht eine bestimmte Funktion. Es wäre großartig, wenn Sie ein einfaches Beispiel oder einen Link zu einem Tutorial bereitstellen könnten. Thanks :)

Antwort

2

Sie können der Cache das Ergebnis der Ansicht, dass die Abfrage ausgeführt wird:

from django.views.decorators.cache import cache_page 

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

Oder die teueren Funktionen in der Ansicht zwischenzuzuspeichern, die in Ihrem Fall fast zum Cachen der gesamte Ansicht ist ein Synonym für:

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

Dies funktioniert wie Magie. Es ist perfekt. Ich danke dir sehr :) –

Verwandte Themen