Не работает код на статус онлайн
При попытке добавить код для статуса как встатье, я сталкнулся с проблемой, что он не записывает данные в бд(поля last_online NULL), такое ощущение, что бек просто не работает. Можете подсказать как это исправить?
Версия Django 3.1.6
Версия питона 3.8.2
Модель юзера
- from django.db import models
- from django.contrib.auth.models import User
- from PIL import Image
- from django.urls import reverse
- from django.contrib.humanize.templatetags.humanize import naturaltime
- from django.utils import timezone
- class Profile(models.Model):
- user = models.OneToOneField(User, on_delete=models.CASCADE)
- image = models.ImageField(default='default.jpg', upload_to='profile_pics')
- last_online = models.DateTimeField(blank=True, null=True)
- def __str__(self):
- return f'{self.user.username} Profile'
- # В данном методе проверяем, что дата последнего посещения не старше 15 минут
- def is_online(self):
- if self.last_online:
- return (timezone.now() - self.last_online) < timezone.timedelta(minutes=15)
- return False
- def get_online_info(self):
- if self.is_online():
- return 'Онлайн'
- if self.last_online:
- return f'Последнее посещение: {naturaltime(self.last_online)}'
- else:
- return 'Не известно'
код MyBackend
- from django.contrib.auth import get_user_model
- from django.utils import timezone
- from django.contrib.auth.backends import BaseBackend
- class MyBackend(BaseBackend):
- def get_user(self, user_id):
- try:
- user = get_user_model().objects.get(pk=user_id)
- user.last_online = timezone.now() # При запросе пользователя выполним обновлении
- # даты и времени последнего посещения
- user.save(update_fields=['last_online'])
- return user
- except get_user_model().DoesNotExist:
- return None
файл settings
- AUTHENTICATION_BACKENDS = (
- 'users.backends.MyBackend',
- 'django.contrib.auth.backends.ModelBackend',
- )
код темплейта
- <span class="caption-1">Статус</span>
- <span class="body-2">{{ user.get_online_info }}</span>
Do you like it? Share on social networks!
- Last comments
- AKApril 1, 2025, 11:41 a.m.Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VPMarch 9, 2025, 4:14 p.m.Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМNov. 22, 2024, 9:51 p.m.Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Now discuss on the forum
- МАApril 1, 2025, 4:21 p.m.0ff763fe-4e50-455d-a3a6-5699c243b1a5_17_44_22_1.xml
- fFeb. 15, 2025, 1:46 p.m.Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
auth_backend - это про другое. Попробуйте сделать это через middleware?
пишет такое
так, я поторопился. Надо разбираться
если вы делаете через auth_backend - last_online будет проставляться только в момент логина. Если сделать через middleware, оно будет обновляться каждый раз,когда пользователь будет делать что-либо.
Тоесть, в первом случае, пользователь может авторизоваться и пользоваться сайтом час-два,но спустя 15 минут будет показано, что он оффлайн. А если нет протухания сессии, пользователь может и на следующий день вернуться, а показано будет, что он оффлайн.
Во втором случае, пока он ходил по ссылкам и выполняет запросы - он будет отображаться, как онлайн. Но возрастет нагрузка на базу.
если нагрузка по боку, я бы сделал такую middleware:
так одним запросом будет обновляться его поле а дальше запросы будут выполняться, как выполнялись
На нагрузку без разницы, и для меня ваш вариант подходит, но к сожалению выбивает в ошибку.
Я заменил класс MyBackend, на ваш предложенный
опечатался:
get_user_model().filter(id=request.user.id).update(last_online=timezone.now())
поменять на:
get_user_model().objects.filter(id=request.user.id).update(last_online=timezone.now())
Спасибо за уделенное время, всё работает