Django pro Benutzer-View-Caching

Ich brauche eine pro Benutzer Zwischenspeicherung. Die regelmäßige View-Caching unterstützt leider keine benutzerbasierte Caching.

Ich habe versucht, die Vorlage Fragment Caching wie folgt :

{% load cache %} {% cache 500 "mythingy" request.user %} ... HTML stuff ... {% endcache %} 

Aber es ist langsam wie die Hölle.

Weiß jemand einen schnelleren Weg, um zu erreichen, was ich brauche?

Vielen Dank!

3 Solutions collect form web for “Django pro Benutzer-View-Caching”

Wie von django> = 1.7, mit der cache_page zusammen mit vari_on_cookie Dekorateure auf Ihre Ansicht sollte dies zu lösen.

etwas wie das.

 from django.views.decorators.vary import vary_on_cookie from django.views.decorators.cache import cache_page @cache_page(60 * 15) @vary_on_cookie def view_to_cache(request): ... 

Beachten Sie die Reihenfolge der Dekorateure als vary_on_cookie sollte verarbeitet werden, bevor es auf cache_page .

Ich habe die Lösung gefunden!

Hier ist dieser portugiesische Code-Snippet, der wie ein Charme funktioniert!

Die gute Sache ist, dass ich nicht brauchen, um um meine Vorlage Code zu spielen, sondern kann einen sauberen Dekorateur verwenden!

Code ist unten enthalten

 # -*- encoding: utf-8 -*- ''' Python >= 2.4 Django >= 1.0 Author: eu@rafaelsdm.com ''' from django.core.cache import cache def cache_per_user(ttl=None, prefix=None, cache_post=False): '''Decorador que faz cache da view pra cada usuario * ttl - Tempo de vida do cache, não enviar esse parametro significa que o cache vai durar até que o servidor reinicie ou decida remove-lo * prefix - Prefixo a ser usado para armazenar o response no cache. Caso nao seja informado sera usado 'view_cache_'+function.__name__ * cache_post - Informa se eh pra fazer cache de requisicoes POST * O cache para usuarios anonimos é compartilhado com todos * A chave do cache será uma das possiveis opcoes: '%s_%s'%(prefix, user.id) '%s_anonymous'%(prefix) 'view_cache_%s_%s'%(function.__name__, user.id) 'view_cache_%s_anonymous'%(function.__name__) ''' def decorator(function): def apply_cache(request, *args, **kwargs): # Gera a parte do usuario que ficara na chave do cache if request.user.is_anonymous(): user = 'anonymous' else: user = request.user.id # Gera a chave do cache if prefix: CACHE_KEY = '%s_%s'%(prefix, user) else: CACHE_KEY = 'view_cache_%s_%s'%(function.__name__, user) # Verifica se pode fazer o cache do request if not cache_post and request.method == 'POST': can_cache = False else: can_cache = True if can_cache: response = cache.get(CACHE_KEY, None) else: response = None if not response: response = function(request, *args, **kwargs) if can_cache: cache.set(CACHE_KEY, response, ttl) return response return apply_cache return decorator 

Das folgende ist eine verbesserte Version für die akzeptierte Lösung berücksichtigt nicht die Anforderungsparameter.

Decorator_of_cache_per_user.py

 from django.core.cache import cache as core_cache def cache_key(request): if request.user.is_anonymous(): user = 'anonymous' else: user = request.user.id q = getattr(request, request.method) q.lists() urlencode = q.urlencode(safe='()') CACHE_KEY = 'view_cache_%s_%s_%s' % (request.path, user, urlencode) return CACHE_KEY def cache_per_user_function(ttl=None, prefix=None, cache_post=False): def decorator(function): def apply_cache(request, *args, **kwargs): CACHE_KEY = cache_key(request) if prefix: CACHE_KEY = '%s_%s' % (prefix, CACHE_KEY) if not cache_post and request.method == 'POST': can_cache = False else: can_cache = True if can_cache: response = core_cache.get(CACHE_KEY, None) else: response = None if not response: response = function(request, *args, **kwargs) if can_cache: core_cache.set(CACHE_KEY, response, ttl) return response return apply_cache return decorator 
  • Wie kann man Ergebnisdatei mit Django bedienen?
  • Django-Code verhält sich anders auf lokalem und Server
  • Verwenden von request.user mit Django ModelForm
  • Importieren von JSON-Daten in Django View / Template
  • Wie kann man Formularfelder durchlaufen und sie alle in der Datenbank speichern?
  • Wie erstelle ich ein Formular aus einem Json-Schema?
  • Wie verwende ich das Anmelden in der Django Debug Toolbar?
  • In django ändern Sie den Dateinamen einer hochgeladenen Datei
  • Render_to_response oder redirect ändert die Template-Elemente in Django 1.8
  • Verwenden Sie `Mit` Tag, um einen Booleschen in Django-Vorlage zu invertieren?
  • Abfrage Viele auf viele Felder in django Vorlage
  • Python ist die beste Programmiersprache der Welt.