Я новичок и сбит с толку. Я хочу создать модуль, который отслеживает наиболее популярные экземпляры как статьи, так и модели блога. Я не хочу трогать код моделей статей или блогов. Это кандидат на промежуточное ПО? глядя на HttpRequest.path
?
Django - подсчет просмотров экземпляров модели (для приложения с лучшими записями)
Ответы (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))
вы можете создать общую модель 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,
})
Такой подход дает вам возможность не только подсчитывать попадания, но и фильтровать историю обращений по времени, типу содержимого и так далее ...
Поскольку таблица совпадений может быстро расти, вам следует подумать о стратегии удаления.