【问题标题】:Using Django signals to identify a present user session使用 Django 信号识别当前用户会话
【发布时间】: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注册了吗?

标签: python django signals


【解决方案1】:

试试这个,

default_app_config = 'Accounts.apps.AccountsConfig'

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

【讨论】:

  • 我试过了,但我仍然得到和以前一样的错误:DoesNotExist at /login/ 会话匹配查询不存在。 - /usr/local/lib/python3.7/site-packages/django/db/models/query.py 在获取中,第 408 行
  • @Venom 你的LOGIN_URL是什么?
  • @Venom 你也可以按照this教程来避免多次登录
  • 我已经尝试过这篇文章,请参阅:stackoverflow.com/questions/56312743/… 无论如何我会再试一次,我想我只是错过了正确配置 init.py
  • 我的错误是在 settings.py 中没有使用以下设置:SESSION_ENGINE = "django.contrib.sessions.backends.db"
猜你喜欢
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 2011-06-10
  • 2019-06-02
  • 2021-06-16
  • 1970-01-01
  • 2015-11-04
相关资源
最近更新 更多