Django - contando vistas instância do modelo (por "entradas principais" app)

votos
0

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?

Publicado 20/05/2009 em 17:19
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Middleware olhando request.path é feio, uma vez que introduz uma dependência sobre os detalhes dos padrões de URL que você usa para exibir artigos 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. ( EDIT : 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 vista middleware iria funcionar se você não quiser. para tocar o URLconf para as aplicações blog / artigo).

Eu usaria 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 assim:

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))
Respondeu 21/05/2009 em 03:05
fonte usuário

votos
0

você pode criar um modelo Hit genérico

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

em sua 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 ...

Como a mesa de bater pode estar crescendo rápido, você deve pensar em uma estratégia de eliminação.

código não testado

Respondeu 31/05/2009 em 00:32
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more