Найти тему

Работа с куками для отслеживания посещенных страниц в 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, сохраняя данные о посещенных страницах и отображая их пользователям. Этот подход может быть полезен для различных типов веб-приложений, где важно учитывать пользовательскую активность.

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