[pyar] Como borrar cache de templates in Django cuando la cache_key usa parametros de GET

Federico Mendez mendezfederico87 en gmail.com
Lun Mar 25 09:42:06 ART 2013


Hola a todos,

Tengo un problema que me estuvo rompiendo el coco toda la mañana:

   - Tengo unas views que aceptan parametros por GET para modificar el
   queryset y cachearlo
   - En mi template tambien tengo que hacer un poco de cacheo porque los
   modelos que lista tienen relaciones hacia otros modelos, asi que llamarlos
   todo el tiempo es "caro":

    {% with order=request.GET.order_by %}{% with page=request.GET.page %}{#
I need them to set the cache name #}
    {% cache 7200 template urlname order page %}
    .... some part of the page...
    {% endcache %}
    {% endwith %}{% endwith %}{# with order and with page #}

   - Borrar el cache del queryset es facil,... ahora, borrar el del
   template es un quilombo. Generalmente, necesitas generar la cache_key con
   una funcion de Django como dice aca:
   https://docs.djangoproject.com/en/dev/topics/cache/#django.core.cache.utils.make_template_fragment_key
.
   El problema, es que yo tengo que pasarle todas las opciones para ordenar,
   las paginas (porque la view esta paginada), y el nombre de la url (que en
   el template consigo con un context processor que agregue)...

So far so shitty. Hasta ahora tengo esto:

SITE_LIST_OPTIONS = [('url', [reverse_lazy('site_list'),
reverse_lazy('best_site_list'),
                         reverse_lazy('banned_site_list'),
reverse_lazy('toreview_site_list')]),
                     ('order', ['url', 'country', 'upstream_rank']),
                     ('page', range(10))]


def delete_cache_keys(keys):
    '''Deletes all the cache keyws on the provided list.'''
    for e in keys:
        cache.delete(e)

def delete_template_cache(key, filters=None):
    # first, we need to get all possible filter combination options
    if filters:
        options = combine_options(filters)
        keys = [make_template_fragment_key(key, ops) for ops in options]
        delete_cache_keys(keys)
    else:
        key = make_template_fragment_key(key, filters)
        cache.delete(key)

# context_processor.py

def urlname(request):
    return {'urlname': resolve_urlname(request)}


Me imagino que no soy la primer persona en el mundo en haber usado la
opcion de cachear templates con parametros optativos que salen de GET...
hay alguna forma mas sana de conseguir hacer esto? (Version del codigo un
poco mas limpia <http://dpaste.org/XYYo2/>)

Tante grazie!

-- 
Mit freundlichen Grüßen,
Federico Mendez
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20130325/7ae7cbf4/attachment.html>


More information about the pyar mailing list