Django - подсчет просмотров экземпляров модели (для приложения с лучшими записями)

Я новичок и сбит с толку. Я хочу создать модуль, который отслеживает наиболее популярные экземпляры как статьи, так и модели блога. Я не хочу трогать код моделей статей или блогов. Это кандидат на промежуточное ПО? глядя на HttpRequest.path?


person Cody Django    schedule 20.05.2009    source источник


Ответы (2)


Промежуточное программное обеспечение, просматривающее request.path, некрасиво, поскольку оно вводит зависимость от деталей шаблонов URL-адресов, которые вы используете для отображения статей и сообщений в блогах. Если вы не возражаете против этой связи, то вы можете просто сохранить снижение производительности и провести анализ файлов журнала веб-сервера. (РЕДАКТИРОВАТЬ: просмотреть промежуточное ПО было бы лучшим вариантом, так как он дает вам вызываемое представление и его аргументы. Я все же предпочел бы подход декоратора, поскольку он не несет накладных расходов на несвязанные представления, но промежуточное ПО представления будет работать, если вы не хотите касаться URLconf для приложений блога / статьи).

Я бы использовал декоратор представления, который вы оборачиваете вокруг представления object_detail (или вашего собственного эквивалента). Вы можете сделать эту упаковку прямо в URLconf. Что-то вроде этого:

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

И вы можете применить его в views.py:

@count_hits
def detail_view(...

или в вашем URLconf:

url(r'^/blog/post...', count_hits(detail_view))
person Carl Meyer    schedule 21.05.2009

вы можете создать общую модель 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')

в вашем view.py вы пишете эту функцию:

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)

и просмотры, которые вы заинтересованы в ответе

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

Такой подход дает вам возможность не только подсчитывать попадания, но и фильтровать историю обращений по времени, типу содержимого и так далее ...

Поскольку таблица совпадений может быстро расти, вам следует подумать о стратегии удаления.

person vikingosegundo    schedule 30.05.2009