Django - подсчет просмотров экземпляров модели (для приложения с «лучшими записями») - PullRequest
0 голосов
/ 20 мая 2009

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

Ответы [ 2 ]

1 голос
/ 21 мая 2009

Промежуточное программное обеспечение, смотрящее на request.path, уродливо, поскольку оно вводит зависимость от деталей шаблонов URL, которые вы используете для отображения статей и постов в блогах. Если вы не возражаете против этой связи, то можете просто сохранить снижение производительности и выполнить анализ в файлах журналов веб-сервера. ( EDIT : представление промежуточного программного обеспечения было бы лучшим вариантом, так как оно дает вам вызываемое представление и его аргументы. Я все же предпочел бы подход декоратора, так как он не требует дополнительных затрат на несвязанные представления , но промежуточное ПО просмотра будет работать, если вы не хотите трогать 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))
0 голосов
/ 31 мая 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,
        })

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...