Question

Je suis nouveau, et confus. Je veux créer un module qui permet de suivre les instances « top » de succès à la fois un article et un modèle de blog. Je ne veux pas toucher le code pour les modèles d'article ou un blog. Est-ce un candidat pour le middleware? regardant le HttpRequest.path?

Était-ce utile?

La solution

Middleware regardant request.path est laid, car il introduit une dépendance sur les détails des modèles d'URL que vous utilisez pour afficher des articles et billets de blogs. Si vous ne me dérange pas ce couplage, alors vous pourriez tout aussi bien enregistrer le succès de la performance et faire votre analyse sur les fichiers journaux de serveur Web. ( EDIT : vue middleware serait une meilleure option, car il vous donne la vue appelable et ses args. Je encore préfère l'approche de décorateur car il engage pas de frais généraux sur les vues non liées, mais middleware vue fonctionnerait si vous ne voulez pas toucher le URLConf pour les applications blog / article).

J'utilise un décorateur de vue que vous enrouler autour de la vue object_detail (ou l'équivalent dans votre commande). Vous pouvez le faire directement dans l'emballage URLconf. Quelque chose comme ceci:

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

Et vous pouvez l'appliquer dans views.py:

@count_hits
def detail_view(...

ou dans votre URLconf:

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

Autres conseils

vous pouvez créer un modèle de réussite générique

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

dans votre view.py vous écrivez cette fonction:

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)

et les vues que vous êtes intéressé par le retour

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

Cette approche vous donne le pouvoir, non seulement de compter le coup, mais pour filtrer le hit-histoire par le temps, CONTENTTYPE et ainsi de suite ...

Comme la table de succès pourrait être de plus en plus rapide, vous devriez penser à une stratégie de suppression.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top