Middleware
Middleware - это система хуков для обработки запросов/ответов в Django. Это легкая, низкоуровневая система «плагинов» для глобального изменения входных или выходных данных Django.
Каждый компонент промежуточного ПО отвечает за выполнение определенной функции. Например, Django включает компонент промежуточного ПО, AuthenticationMiddleware, который связывает пользователей с запросами с помощью сессий.
Один из способов добавления статуса пользователей основывается как раз на использовании Middleware, который позволяет обрабатывать запросы перед тем, как они будут обработаны во view. Middleware позволяет работать со всеми запросами, и поэтому он является отличным местом для реализации этого функционала.
Добавим файловую систему кэширования
Пока мы обойдемся файловой системой кэширования, поэтому в файл настроек settings.py добавим следующий код в любое место:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': (BASE_DIR / 'cache'),
}
}
Этим кодом мы подключаем файловую систему кэширования. Мы не будем глубоко рассматривать систему кэширования в Django, так как она довольна обширная, но для решения нашей задачи материала будет достаточно. В следующем курсе мы подробно разберём её работу и использование в проектах.
Создание Middleware
Создадим фай middleware.py в приложение accounts, который добавляет функционал статуса пользователей:
from django.contrib.auth.models import User
from django.core.cache import cache
from django.utils import timezone
from django.utils.deprecation import MiddlewareMixin
class ActiveUserMiddleware(MiddlewareMixin):
def process_request(self, request):
if request.user.is_authenticated and request.session.session_key:
cache_key = f'last-seen-{request.user.id}'
last_login = cache.get(cache_key)
if not last_login:
User.objects.filter(id=request.user.id).update(last_login=timezone.now())
# Устанавливаем кэширование на 300 секунд с текущей датой по ключу last-seen-id-пользователя
cache.set(cache_key, timezone.now(), 300)
Этот код представляет собой Middlewareкласс ActiveUserMiddleware, который используется для обновления статуса "онлайн" пользователя в Django с помощью кэширования. Более подробнее с Middleware вы можете ознакомится в документации.
Middlewareкласс ActiveUserMiddleware определяет метод process_request(), который вызывается для каждого входящего запроса. В этом методе проверяется, авторизован ли пользователь, и имеет ли его сессия уникальный идентификатор session_key.
Если пользователь авторизован и имеет уникальный session_key, то обновляется его статус "последний раз в сети" с помощью метода cache.set() и сохраняется в кэше на время 300 секунд (можем установить любое значение).
Если в кэше нет записи для пользователя, то его последнее время входа в систему обновляется на текущее время с помощью метода User.objects.filter().update(), и время записывается в кэш.
Добавим этот middleware в конфигурационный файл проекта для его выполнения:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'debug_toolbar.middleware.DebugToolbarMiddleware',
'apps.accounts.middleware.ActiveUserMiddleware', # New
]
В следующем шаге мы добавим метод в модель для вывода статуса пользователя.