Frage

Ich bin neu, und verwirrt. Ich möchte ein Modul erstellen, die den Überblick über die „Top-Hit“ Instanzen des Modells sowohl einem Artikel und einem Blog hält. Ich möchte nicht, den Code für die Artikel oder Blog-Modelle berühren. Ist das ein Kandidat für die Middleware? Blick auf die HttpRequest.path?

War es hilfreich?

Lösung

Middleware bei request.path suchen, ist hässlich, da es eine Abhängigkeit von den Details der URL-Muster verwenden Sie stellt Artikel und Blog-Posts anzuzeigen. Wenn Sie nicht über diese Kopplung dagegen haben, dann könnten Sie auch sparen nur die Performance-Einbußen und tun Sie Ihre Analyse auf Webserver-Log-Dateien. ( Bearbeiten : Ansicht Middleware wäre eine bessere Option sein, da es Ihnen die Ansicht aufrufbar und seine args gibt. ich noch den Dekorateur Ansatz bevorzugen würde, da es keinen Overhead auf unabhängige Ansichten entstehen, aber Sicht Middleware würde funktionieren, wenn Sie die URLconf nicht berühren wollen für die Blog / Artikel-Anwendungen).

würde ich einen Blick Dekorateur verwenden, die Sie rund um die object_detail Ansicht wickeln (oder Ihre benutzerdefinierte Äquivalent). Sie können direkt in der URLconf diese Verpackung tun. So etwas wie folgt aus:

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

Und Sie können es in views.py gelten:

@count_hits
def detail_view(...

oder in Ihrem URLconf:

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

Andere Tipps

Sie können ein generisches Hit-Modell erstellen

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

in Ihrem view.py Sie schreiben diese Funktion:

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)

und die Ansichten, die Sie interessieren sich für Rückkehr sind

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

Dieser Ansatz gibt Ihnen die Macht, nicht nur den Treffer zu zählen, aber die Treffer-Geschichte von Zeit zu filtern, CONTENT und so weiter ...

Wie der Hit-Tabelle schnell könnte wachsen, sollten Sie über eine Lösch Strategie denken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top