Функция 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 секунд), и перейдем на страницу профиля нашего пользователя, то увидим его статус "Не в сети"
При этом файлы у данного типа кеширования хранятся в общей папке проекта.
Таким образом мы создали оптимизированную систему статусов пользователей, используя систему кэширования.