Django - modelo de contagem de visualizações instância (por um “top entradas” app)
-
23-08-2019 - |
Pergunta
Eu sou novo, e confuso. Eu quero criar um módulo que controla as instâncias "top hit" de ambos um artigo e um modelo de blog. Eu não quero tocar o código para os modelos de artigo ou blog. É este um candidato para middleware? olhando para o HttpRequest.path
?
Solução
Middleware olhando request.path é feio, uma vez que introduz uma dependência sobre os detalhes dos padrões de URL que você usa para artigos de exibição e posts. Se você não se importa este acoplamento, então você pode muito bem salvar o acerto de desempenho e fazer a sua análise sobre os arquivos de log do servidor web. ( Editar : vista middleware seria uma opção melhor, pois dá-lhe a visão pode ser chamado e seus argumentos. Eu ainda prefiro a abordagem decorador, uma vez que não incorre em sobrecarga em vista alheios, mas ver middleware iria funcionar se você não quer tocar no URLconf para as aplicações blog / artigo).
Eu uso um decorador de visão que você envolver em torno da vista object_detail (ou seu costume equivalente). Você pode fazer isso de embrulho directamente no URLconf. Algo parecido com isto:
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 você pode aplicá-lo em views.py:
@count_hits
def detail_view(...
ou em seu URLconf:
url(r'^/blog/post...', count_hits(detail_view))
Outras dicas
Você pode criar um 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')
no seu view.py você escreve esta função:
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 os pontos de vista que você está interessado no retorno
return render_to_response_hit_count(request, 'map/list.html',['list',],
{
'list': l,
})
Esta abordagem dá-lhe o poder, não só para contar o sucesso, mas para filtrar o hit-história pelo tempo, contenttype e assim por diante ...
As-mesa hit do pode estar crescendo rápido, você deve pensar em uma estratégia de exclusão.