Django - comptage des vues d'exemple modèle (pour une application « premières entrées »)
-
23-08-2019 - |
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
?
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.