Django - подсчет просмотров экземпляров модели (для приложения “top entries”)

StackOverflow https://stackoverflow.com/questions/888905

Вопрос

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

Это было полезно?

Решение

Промежуточное программное обеспечение просматривает запрос.path является некрасивым, поскольку он вводит зависимость от деталей шаблонов URL, которые вы используете для отображения статей и сообщений в блоге.Если вы не возражаете против такой связи, то с таким же успехом вы могли бы просто сохранить снижение производительности и выполнить свой анализ в файлах журнала веб-сервера.(Редактировать: просмотр промежуточного программного обеспечения было бы лучшим вариантом, так как это дает вам вызываемый вид и его аргументы.Я бы все же предпочел подход декоратора, поскольку он не требует накладных расходов на несвязанные представления, но промежуточное программное обеспечение view будет работать, если вы не хотите прикасаться к URLconf для приложений blog / article).

Я бы использовал декоратор представления, который вы обертываете вокруг представления 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))

Другие советы

вы могли бы создать общую модель попадания

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,
        })

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top