Categories: Web-development

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

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

admin

Share
Published by
admin

Recent Posts

Apple: история логотипа

Как менялся логотип Apple на протяжении многих лет. Логотип Apple — это не просто символ,…

2 месяца ago

Security Boot Fail при загрузке Acer — решение проблемы

Security Boot Fail при загрузке Acer — решение проблемы При загрузке ноутбука Acer с флешки,…

2 месяца ago

Ноутбук не включается — варианты решения

Ноутбук не включается — варианты решения Если при попытке включить ноутбук вы обнаруживаете, что он…

2 месяца ago

The AC power adapter wattage and type cannot be determined — причины и решение

The AC power adapter wattage and type cannot be determined — причины и решение При…

2 месяца ago

Свистит или звенит блок питания компьютера — причины и решения

Свистит или звенит блок питания компьютера — причины и решения Некоторые владельцы ПК могут обратить…

2 месяца ago

Мигает Caps Lock на ноутбуке HP — почему и что делать?

Мигает Caps Lock на ноутбуке HP — почему и что делать? При включении ноутбука HP…

2 месяца ago