Domanda

Sono nuovo, e confuso. Voglio creare un modulo che registra i casi "Top Hit" sia di un articolo e un modello blog. Non voglio toccare il codice per i modelli di articolo o blog. E 'questo un candidato per middleware? guardando il HttpRequest.path?

È stato utile?

Soluzione

Middleware guardando request.path è brutto, in quanto introduce una dipendenza i dettagli dei modelli di URL che si utilizza per visualizzare articoli e post di blog. Se non ti dispiace questo accoppiamento, allora si potrebbe anche solo salvare il calo di prestazioni e fare la tua analisi su file di log del server web. ( Modifica : vista middleware sarebbe una scelta migliore, in quanto ti dà la vista callable e le sue args. io preferisco ancora l'approccio decoratore in quanto non comporta alcun sovraccarico sulle viste non correlate, ma vista middleware potrebbe funzionare se non si vuole toccare l'URLconf per le applicazioni blog / articolo).

mi piacerebbe utilizzare un decoratore vista che si avvolge attorno alla vista object_detail (o importo equivalente personalizzato). È possibile farlo da imballaggio direttamente nel URLconf. Qualcosa di simile a questo:

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

E si può applicare in views.py:

@count_hits
def detail_view(...

o nel vostro URLconf: |

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

Altri suggerimenti

è possibile creare un modello di Hit generica

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')

nel vostro view.py si scrive questa funzione:

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)

e il punto di vista che si sono interessati in cambio

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

Questo approccio si dà il potere, non solo di contare il colpo, ma per filtrare il colpo-storia dal tempo, ContentType e così via ...

Come la hit-tabella potrebbe essere in rapida crescita, si dovrebbe pensare a una strategia di eliminazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top