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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top