Django - подсчет просмотров экземпляров модели (для приложения “top entries”)
-
23-08-2019 - |
Вопрос
Я новичок и сбит с толку.Я хочу создать модуль, который отслеживает экземпляры "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,
})
Такой подход дает вам возможность не только подсчитывать количество посещений, но и фильтровать историю посещений по времени, типу контента и так далее...
Поскольку таблица попаданий может быстро расти, вам следует подумать о стратегии удаления.