使用 Django 信号识别当前用户会话

Using Django signals to identify a present user session

我想使用 django 信号来识别用户是否登录了两次,如果是,则撤销他的第一个会话,以便一次只能存在一个用户会话。

我使用了以下示例,但似乎我的 signals.py 甚至没有重新连接,我不知道为什么。

示例:

accounts/signals.py

from django.contrib.auth import user_logged_in
from django.dispatch.dispatcher import receiver
from django.contrib.sessions.models import Session
from .models import UserSession


@receiver(user_logged_in)
def remove_other_sessions(sender, user, request, **kwargs):
    # remove other sessions
    Session.objects.filter(usersession__user=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=user,
        session=Session.objects.get(pk=request.session.session_key)
    )

accounts/models.py

# Model to store the list of logged in users
class UserSession(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    session = models.OneToOneField(Session, on_delete=models.CASCADE)

accounts/apps.py

from django.apps import AppConfig



class AccountsConfig(AppConfig):
    name = 'Accounts'

    def ready(self):
        import Accounts.signals

但由于某种原因,没有任何内容被写入数据库 table。

我可能在这里遗漏了什么,这是我第一次接触信号,所以我可能在配置时遗漏了一些东西。

试试这个,

default_app_config = 'Accounts.apps.AccountsConfig'

将此行添加到 apps.py 文件目录的 __init__.py 文件中。