Django предотвращает вход в систему нескольких пользователей
Я хотел ограничить пользователей одним логином на аккаунт. Я прочитал множество постов, и в частности следовал этому посту: Как предотвратить множественный вход в Django.
В файле myapp/models.py у меня есть следующее:
from django.conf import settings
from django.db import models
from django.contrib.sessions.models import Session
...
class UserSession(models.Model):
user_acc = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
session_manager = models.OneToOneField(Session, on_delete=models.CASCADE)
В myaurth/views.py я импортирую из myapp/models.py и имею следующее:
from django.contrib.auth import user_logged_in
from django.dispatch.dispatcher import receiver
...
@receiver(user_logged_in)
def remove_other_sessions(sender, user, request, **kwargs):
# remove other sessions
Session.objects.filter(usersession__user_acc=user).delete()
# save current session
request.session.save()
# create a link from the user to the current session (for later removal)
UserSession.objects.get_or_create(
user_acc=user,
session_manager=Session.objects.get(pk=request.session.session_key)
)
Я не использую пользовательскую модель пользователя. Когда я запускаю этот код, он работает правильно, когда пользователь входит в систему в первый раз и создает запись в таблице usersession. После этого у меня возникают проблемы:
- If I login a second user, it logs them in, but it replaces the first user's session info with the second user's in the usersession table. I never see more than one entry in the usersession table, which is the last user to successfully login.
- Worse, if I attempt to login the first user a second time (and this works even if there is no other user logged in). It removes the entry in the usersession table, but fails with an Update Error:
UpdateError at / Сообщение об исключении не предоставлено
- Once the entry has been deleted from the usersession table (as in 2 above), a user that is logged in can login to a new session...
Я думаю, что именно вызов request.session.save() вызывает ошибку обновления, но я в растерянности и не понимаю, почему я получаю только одну запись в таблице usersession, когда несколько учетных записей успешно вошли в систему. Насколько я понимаю, это должно работать так: вторая учетная запись должна успешно войти в систему, но первая должна быть выкинута.
Любые предложения о том, что я делаю неправильно, будут очень признательны.
Спасибо--
Al