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. После этого у меня возникают проблемы:

  1. 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.
  2. 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 / Сообщение об исключении не предоставлено

  1. 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

Вернуться на верх