【发布时间】:2019-06-09 18:55:44
【问题描述】:
我想使用 django 信号来识别用户是否登录了两次,如果是,则撤销他的第一个会话,以便一次只能存在一个用户会话。
我使用了以下示例,但似乎我的 signals.py 甚至没有重新识别,我不知道为什么。
示例: How to prevent multiple login in Django
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
但由于某种原因,该表的数据库中没有写入任何内容。
我可能在这里错过了什么吗,这是我第一次接触信号,所以我可能会在配置中错过一些东西。
【问题讨论】:
-
如果您错误地导入应用程序,通常无法识别信号。查看您的
INSTALLED_APPS以获得完整路径,即<app_name>.apps.AccountsConfig -
好的,到目前为止,谢谢,至少现在我得到了一个执行:D 文件“/usr/local/lib/python3.7/site-packages/django/db/models/query.py” ,第 408 行,在获取应用程序 | self.model._meta.object_name 应用程序 | django.contrib.sessions.models.Session.DoesNotExist:会话匹配查询不存在。应用 | [27/May/2019 15:27:10] "POST /login/ HTTP/1.1" 500 99601
-
猜猜你的问题在这里
Session.objects.get(pk=request.session.session_key)- 由于某种原因它不存在。尝试将session.save()保存到变量中并在此处传递。 -
您能否解释一下:尝试将 session.save() 保存到变量中并在此处传递
-
@Venom 你在
__init__.py注册了吗?