Добавление счетчика уникальных просмотров на сайт
Как добавить счетчик уникальных просмотров на сайт без завязки на авторизацию. Т.е. без необходимости регистрироваться на сайте. Ответ - сессии. Она начинается с момента вашего захода на сайт и хранит в себе ваши запросы (действия) на этом сайте. Лайки, просмотры, товары в корзине и прочее. Сессия в django по умолчанию живет две недели, но мы сделаем два месяца.
Делается это в файле C:\Users\<Ваш пользователь>\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\django\conf\global_settings.py.
# Age of cookie, in seconds (default: 2 weeks).
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 10
Т.е. секунды * минуты * часы * дни * недели.
Уровень данной статьи предполагает, что вы уже можете самостоятельно создать проект django, настроить url, создавать простые модели, делать миграции, создавать шаблоны. Если нет - то посмотрите эту статью.
Счетчик просмотров я буду делать для статей блога. И так мы имеем блог со списком статей, которые описаны моделью Post файл models.py в django приложении.
from django.db import models
from ckeditor_uploader.fields import RichTextUploadingField
class Post(models.Model):
# название публикации
title = models.CharField(max_length=150, db_index=True)
# уникальный идентификатор
slug = models.SlugField(max_length=150, unique=True)
# счетчик просмотров
count_views = models.IntegerField(default=0)
# текст статьи
body = RichTextUploadingField(blank=True)
# дата публикации
date_pub = models.DateField(auto_now_add=True)
# изображение
img = models.ImageField(upload_to='images/', blank=True)
class Meta:
ordering = ['date_pub']
def __str__(self):
return '{}'.format(self.title)
def get_absolute_url(self):
return reverse('post_detail_url', kwargs={'slug': self.slug})
Как видно модель Post обладает вполне обычным набором свойств. Выделить тут можно только поле body
body = RichTextUploadingField(blank=True)
Такой тип поля необходим потому что для создания статей я применяю редактор CKEditor. Если у вас его нет, то замените этот тип поля на CharField или TextField.
Теперь создадим модель которая будет содержать в себе информацию о пользователе (сессию) и идентификатор поста, который он просмотрел. Во все тот же models.py добавим:
class PostCountViews(models.Model):
# привязка к пользователю (сессии пользователя)
sesId = models.CharField(max_length=150, db_index=True)
# привязка к посту
postId = models.ForeignKey(Post, blank=True, null=True, default=None, on_delete=models.CASCADE)
def __str__(self):
return '{}'.format(self.sesId)
Модели созданы, не забываем сделать миграции и зарегистрировать модели в admin.py
admin.site.register(Post)
admin.site.register(PostCountViews)
Теперь переходим к функциям отображения наших постов views.py
def post_detail(request, slug):
# Проверяем есть ли пост с запрашиваемым слагом
post = get_object_or_404(Post, slug__iexact=slug)
if not request.session.session_key:
request.session.save()
# получаем сессию
session_key = request.session.session_key
is_views = PostCountViews.objects.filter(postId=post.id, sesId=session_key)
# если нет информации о просмотрах создаем ее
if is_views.count() == 0 and str(session_key) != 'None':
views = PostCountViews()
views.sesId = session_key
views.postId = post
views.save()
post.count_views += 1
post.save()
return render(request, 'post_detail.html', context={'post': post})
Что значит этот код. При открытии статьи мы получаем сессию пользователя, потом проверяем есть ли у нас уже просмотры этой статьи (post.id) с этим пользователем (session_key). Если нет создаем и добавляем счетчик в статье. После чего сохраняем модели.
Все, осталось отобразить это в шаблоне post_detail.html
{% block content %}
{% for post in posts %}
.....
<div>{{ post.date_pub }}</div>
<div>{{ post.count_views }}</div>
.....
{% endfor %}
{% endblock %}
Все как это работает в живую можно посмотреть на этом сайте на главной странице и в подробной информации о посте.
Комментарии
Добавить комментарий