Pregunta

Soy nuevo, y confundido. Quiero crear un módulo que realiza un seguimiento de los casos "top hit" tanto un artículo y un modelo blog. No quiero tocar el código para los modelos de artículos o blogs. Es este un candidato para el middleware? mirando el HttpRequest.path?

¿Fue útil?

Solución

Middleware mirando request.path es feo, ya que introduce una dependencia de los detalles de los patrones de URL que utiliza para mostrar artículos y blogs. Si no te importa este acoplamiento, entonces puede ser que también acaba de guardar el impacto en el rendimiento y hacer su análisis sobre los archivos de registro del servidor web. ( editar : vista middleware sería una mejor opción, ya que le da la vista exigible y sus argumentos. todavía prefiero el enfoque decorador, ya que no incurre en gastos indirectos en las opiniones ajenas, pero vista middleware funcionaría si no quiere tocar el URLconf para las aplicaciones blog / artículo).

que haría uso de un decorador de vista que se envuelve alrededor de la vista object_detail (o su equivalente personalizado). Esto se puede hacer directamente en la envoltura URLconf. Algo como esto:

def count_hits(func):
    def decorated(request, *args, **kwargs):
        # ... find object and update hit count for it...
        return func(request, *args, **kwargs)
    return decorated

Y se puede aplicar en views.py:

@count_hits
def detail_view(...

o en su URLconf:

url(r'^/blog/post...', count_hits(detail_view))

Otros consejos

se puede crear un modelo genérico Hit

class Hit(models.Model):
    date = models.DateTimeFiles(auto_now=True)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

en su view.py se escribe esta función:

def render_to_response_hit_count(request,template_path,keys,response):
    for  key in keys:
        for i in response[key]:
             Hit(content_object=i).save()
    return render_to_response(template_path, response)

y las vistas que le interesa a cambio

return render_to_response_hit_count(request,   'map/list.html',['list',],
        {
            'list': l,
        })

Este enfoque le da el poder, no sólo para contar el golpe, pero para filtrar el hit-historia al tiempo, CONTENTTYPE y así sucesivamente ...

A medida que el éxito de la tabla podría estar creciendo rápidamente, usted debe pensar en una estrategia de eliminación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top