Django 5 для начинающих

Прогресс по курсу:  9/1004

11.8 Кеширование и Middleware для получения статуса пользователей
2 из 2 шагов пройдено

Функция is_online() в модели профиля

В models.py приложения accounts, в модели Profile, добавим метод is_online(), который проверяет, был ли пользователь онлайн в течение последних 5 минут:

from django.utils import timezone
from django.core.cache import cache


class Profile(models.Model):

    # поля и методы модели


    def is_online(self):
        last_seen = cache.get(f'last-seen-{self.user.id}')
        if last_seen is not None and timezone.now() < last_seen + timezone.timedelta(seconds=300):
            return True
        return False

Вывод статуса

Переходим в наш HTML шаблон профиля пользователя (templates/accounts/profile_detail.html) и изменим код, добавив вывод статуса пользователя:

{% extends 'main.html' %}

{% block content %}
<div class="card border-0">
        <div class="card-body">
            <div class="row">
                <div class="col-md-3">
                    <figure>
                        <img src="{{ profile.avatar.url }}" class="img-fluid rounded-0" alt="{{ profile }}">
                    </figure>
                </div>
                <div class="col-md-9">
                     <h5 class="card-title">
                        {{ profile }}
                    </h5>
                    <div class="card-text">
                        <ul>
                            <li>Никнейм: {{ profile.user.username }}</li>
                            {% if profile.user.get_full_name %} <li>Имя и фамилия: {{ profile.user.get_full_name }}</li> {% endif %}
                            <li>Заходил: {{ profile.user.last_login }} | {% if profile.is_online %}Онлайн{% else %}Не в сети{% endif %}</li>
                            <li>Дата рождения: {{ profile.birth_date }}</li>
                            <li>О себе: {{ profile.bio }}</li>
                        </ul>
                    {% if request.user == profile.user %} <a href="{% url 'profile_edit' %}" class="btn btn-sm btn-primary">Редактировать профиль</a> {% endif %}
                    </div>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

На этом написание кода закончено, перейдем к тестированию. Запустим сервер и перейдем на главную страницу нашего блога 2.0. И если мы авторизуемся на сайте и откроем вкладку кэша в Debug Toolbar то увидим следующее:

При первом обращении на страницу мы получим 2 взаимодействия с кэшем, где увидим первое: получение ключа, установку ключа. Теперь перейдем раздел профиля пользователя и мы увидим что у нас установлен статус "Онлайн"

При повторном запросе делается один запрос к кэшу, запрос нового кэша будет выполнен лишь при запросе по истечению 300 секунд. В случае, если мы не являемся авторизованным пользователем, не имея свой статус онлайна, мы делаем лишь одно обращение к кэшу только при посещении страницы пользователя.

И если мы подождем 5 минут (300 секунд), и перейдем на страницу профиля нашего пользователя, то увидим его статус "Не в сети"

При этом файлы у данного типа кеширования хранятся в общей папке проекта.

Таким образом мы создали оптимизированную систему статусов пользователей, используя систему кэширования.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
Нет обсуждений. Начните первое.