Добавление счетчика уникальных просмотров на сайт

Как добавить счетчик уникальных просмотров на сайт без завязки на авторизацию. Т.е. без необходимости регистрироваться на сайте. Ответ - сессии. Она начинается с момента вашего захода на сайт и хранит в себе ваши запросы (действия) на этом сайте. Лайки, просмотры, товары в корзине и прочее. Сессия в 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 %}

 

Все как это работает в живую можно посмотреть на этом сайте на главной странице и в подробной информации о посте.

Комментарии

Пользователь 1111 написал 24 декабря 2022 г. 10:57

1111


Добавить комментарий

footer
Перепечатывание материалов сайта с указанием первоисточника приветствуется.
Копирайт © 2019 - 2021. Блог PYTHON разработчика. Все права защищены.