Vorrei implementare un decoratore che fornisca il caching per richiesta su qualsiasi metodo, non solo sulle viste. Ecco un esempio di utilizzo.cache per richiesta in Django?
Ho un tag personalizzato che determina se un record in una lunga lista di record è un "preferito". Per verificare se un articolo è un preferito, è necessario interrogare il database . Idealmente, è necessario eseguire una query per ottenere tutti i preferiti, quindi controllare l'elenco memorizzato per ogni record.
Una soluzione è quella di ottenere tutti i favoriti nella vista e quindi passare che impostare nel modello, e poi in ogni chiamata tag.
In alternativa, lo stesso tag potrebbe eseguire la query stessa, ma solo la prima volta che viene chiamato. Quindi i risultati potrebbero essere memorizzati nella cache per le successive chiamate . Il lato positivo è che puoi usare questo tag da qualsiasi modello, su qualsiasi vista, senza avvisare la vista.
Nel meccanismo di caching esistente, è potrebbe semplicemente memorizzare nella cache il risultato per 50 ms, e assumere che sarebbe correlare alla richiesta corrente . Voglio rendere affidabile la correlazione .
Ecco un esempio del tag che attualmente ho.
@register.filter()
def is_favorite(record, request):
if "get_favorites" in request.POST:
favorites = request.POST["get_favorites"]
else:
favorites = get_favorites(request.user)
post = request.POST.copy()
post["get_favorites"] = favorites
request.POST = post
return record in favorites
C'è un modo per ottenere l'oggetto di richiesta corrente da Django, senza passarlo? Da un tag, potevo semplicemente passare la richiesta, che esisterà sempre. Ma mi piacerebbe usare questo decoratore da altre funzioni.
Esiste un'implementazione esistente di una cache per richiesta?
Diffida di questa soluzione! Il dizionario _request_cache si riempirà continuamente con l'apertura di un numero sempre maggiore di thread per servire gli utenti e non verrà mai ripulito. A seconda di come il tuo server web memorizza le variabili globali di Python, ciò potrebbe causare una perdita di memoria. – CoreDumpError
Si dovrebbe cancellare la cache nel metodo process_response ????? –
Sì - cancella la cache su process_response e process_expception - c'è un ottimo esempio di questo nel plugin middleware django cuser. Vedi: https://github.com/Alir3z4/django-cuser/blob/master/cuser/middleware.py –