2016-07-28 11 views
1

Ich benutze Djangos eingebautes Caching mit dem @cache_page Decorator. Ich möchte jedoch, dass der Cache periodisch automatisch aktualisiert wird, so dass eine Aktualisierung nicht durch eine tatsächliche Seitenanforderung von einem Benutzer ausgelöst wird, was zu einer Verzögerung führt.Auto-Refresh-Cache

Eine offensichtliche Strategie, die in den Sinn kommt, ist die Verwendung einer Sellerie Aufgabe. Ich habe 2 Fragen bitte:

  1. Wenn der Sellerie-Task-Ansatz akzeptabel ist, welchen Code brauche ich, um a) die Aktualisierung auslösen und für b) eine unbekannte Anzahl von Seiten, z. myapp.com/products/?page=2, myapp.com/products/?page=3 (Ich kann die Anzahl der Seiten nicht vorhersagen)
  2. Gibt es einen besseren Ansatz?

Antwort

0

Ich schrieb am Ende eine Sellerie-Aufgabe mit dem requests Framework, um den Cache jede Stunde zu aktualisieren - es beschäftigt sich auch mit Paginierung. Beispielcode:

@shared_task 
def refresh_caches(): 
    header = {"Content-Type": "application/json; charset=utf-8", 
         "Authorization": settings.USER_TOKEN} 

    next_page_url = settings.API_URL +'/products/' 
    while len(next_page_url) > 0: 
     response = requests.get(next_page_url, headers=header) 
     next_page_url = '' 
     jsonresponse = response.json() 
     if jsonresponse.get('next'): 
      next_page_url = jsonresponse['next'] 
0

Ich denke, eine Sellerie Aufgabe für das ist ein Overkill. Es gibt eine Einstellung, die den Cacheablauf definiert:

CACHE_MIDDLEWARE_SECONDS - Die Anzahl der Sekunden, die jede Seite zwischengespeichert werden soll.

Referenz: Django docs

Dies wurde in 1,8 und wirkt sich auf die Dauer von @cache_page eingeführt. Verwechseln Sie es nicht mit der CACHES: TIMEOUT Einstellung, die für die Verwendung der Cache-Funktionen wie cache.set() ist. Mehr dazu here.

+0

Ich verstehe das Cache-Timeout. Was ich verhindern möchte, ist eine vom Benutzer initiierte Anforderung, die den Cache aktualisiert, was eine Verzögerung verursacht - ich möchte eine Cacheaktualisierung manuell auslösen. – RunLoop

+0

@RunLoop Ich sehe. Mein Verständnis ist, dass eine Benutzeranforderung den Cache nicht verlängern sollte, es soll 'CACHE_MIDDLEWARE_SECONDS' nach dem Setzen ablaufen, aber wir müssen den Code eingraben, um dies zu bestätigen. Dies ist jedoch ein Problem, wenn Sie dies nicht selbst möchten und es manuell ablaufen lassen müssen. – Wtower