L o a d i n g
Подробное руководство: Работа с куками для отслеживания посещенных страниц в Django Парсинг данных

На многих веб-сайтах полезно отслеживать, какие страницы пользователи посещают. Это может помочь в создании персонализированного опыта и улучшении навигации. Одним из способов реализации этой функции является использование куков (cookies). В этом руководстве мы рассмотрим, как использовать куки в Django для хранения информации о недавно посещенных страницах.

Шаг 1: Определение задачи

Наша задача — сохранить в куках информацию о недавно посещенных страницах и показать её пользователям. Мы будем использовать куки для хранения списка слагов (текстовых идентификаторов) страниц, которые пользователь посетил. Этот список будет обновляться каждый раз, когда пользователь посещает новую страницу, и отображаться на самой странице.

Шаг 2: Создание представления (View)

Создадим представление WikiPagesView, которое будет обрабатывать запросы к страницам вики и управлять куками. Для этого нам понадобится следующее:

  1. Получение данных страницы: Используем Django ORM для получения данных о странице, комментариях и категориях.
  2. Работа с куками: Читаем и обновляем куки, чтобы отслеживать недавно посещенные страницы.
  3. Формирование ответа: Рендерим страницу с необходимым контекстом и устанавливаем куки с обновленным списком.

Шаг 3: Код представления

Рассмотрим код нашего представления подробно:

from django.shortcuts import get_object_or_404, redirect, render
from django.views import View
import json

class WikiPagesView(View):
    def get(self, request, slug):
        # Получаем объект страницы вики по слагу
        wiki_page = get_object_or_404(WikiPages, slug=slug)
        wiki_pages_categories = WikiPageCategories.objects.all()
        wiki_pages_comments = wiki_page.comments.filter(status='published')
        wiki_pages_comments_count = wiki_pages_comments.count()

        # Определяем текст для количества комментариев
        summary = ''
        if wiki_pages_comments_count == 0:
            summary = 'Оставить комментарий'
        elif wiki_pages_comments_count == 1:
            summary = 'комментарий'
        elif wiki_pages_comments_count // 2 and wiki_pages_comments_count <= 4:
            summary = 'комментария'
        elif wiki_pages_comments_count > 4:
            summary = 'комментариев'
        else:
            summary = 'комментарий'

        # Получаем данные о недавно посещенных страницах из куков
        recent_post = request.COOKIES.get('recent_post')
        if recent_post:
            recent_post = json.loads(recent_post)
        else:
            recent_post = []

        # Добавляем текущую страницу в список недавно посещенных, если её там нет
        if wiki_page.slug not in recent_post:
            recent_post.append(wiki_page.slug)
            if len(recent_post) > 5:
                recent_post = recent_post[:5]
            response = redirect('wikipages', slug=wiki_page.slug)
            response.set_cookie('recent_post', json.dumps(recent_post))
            return response

        # Формируем контекст для шаблона
        categories_with_pages = {}
        for category in wiki_pages_categories:
            categories_with_pages[category] = WikiPages.objects.filter(category=category)
        response = render(request, 'wikipage/wiki_page.html', {
            'wiki_page': wiki_page,
            'categories_with_pages': categories_with_pages,
            'wiki_pages_comments': wiki_pages_comments,
            'wiki_pages_comments_count': wiki_pages_comments_count,
            'summary': summary,
            'recent_post': recent_post,
        })

        # Устанавливаем куки с данными о недавно посещенных страницах
        response.set_cookie('recent_post', json.dumps(recent_post), max_age=60 * 60 * 24 * 7)

        return response

Подробное объяснение кода

  1. Импорт необходимых модулей:

    • get_object_or_404: Функция для получения объекта или возврата ошибки 404, если объект не найден.
    • redirect: Функция для перенаправления пользователя на другую страницу.
    • render: Функция для рендеринга шаблона с передачей контекста.
    • json: Модуль для работы с JSON-данными.
  2. Получение данных страницы:

    • get_object_or_404(WikiPages, slug=slug): Находим объект страницы вики по её слагу. Если страница не найдена, возвращаем ошибку 404.
    • wiki_pages_categories: Получаем все категории страниц вики.
    • wiki_pages_comments: Фильтруем комментарии страницы, оставляя только опубликованные.
    • wiki_pages_comments_count: Получаем количество опубликованных комментариев.
  3. Определение текста для количества комментариев:

    • В зависимости от количества комментариев определяем, какой текст отобразить (например, "комментарий", "комментария", "комментариев").
  4. Работа с куками:

    • request.COOKIES.get('recent_post'): Получаем данные о недавно посещенных страницах из куков. Если куки отсутствуют, создаем пустой список.
    • Проверяем, есть ли текущая страница в списке недавно посещенных. Если нет, добавляем её и обрезаем список до пяти элементов.
    • Обновляем куки с новым списком и перенаправляем пользователя на ту же страницу, чтобы применить изменения.
  5. Формирование ответа:

    • categories_with_pages: Создаем словарь, где ключи — категории, а значения — списки страниц в каждой категории.
    • render(request, 'wikipage/wiki_page.html', context): Рендерим шаблон страницы вики с переданным контекстом (данные страницы, комментарии, недавно посещенные страницы и т.д.).
    • Устанавливаем куки с обновленным списком недавно посещенных страниц и сроком действия 7 дней.

Заключение

Использование куков для отслеживания недавно посещенных страниц позволяет создать более персонализированный пользовательский опыт и улучшить навигацию на сайте. В нашем примере мы рассмотрели, как можно реализовать этот функционал в Django, сохраняя данные о посещенных страницах и отображая их пользователям. Этот подход может быть полезен для различных типов веб-приложений, где важно учитывать пользовательскую активность.

Если у вас возникли вопросы или предложения, оставляйте комментарии ниже!

Написать комментарий

Вы можете оставить комментарий автору статьи Обязательные поля помечены *