如何使用Django消息来提醒其他用户?

时间:2012-04-03 13:37:02

标签: django messaging

我有一些漂亮的代码,在用户登录时,发现任何其他用户以该用户身份登录并将其记录下来。它工作正常,但它没有提供任何关于为什么这些人不再登录的指示,所以我试图用Django的消息系统来解决这个问题。

  

您已退出,因为某人一直在分享他们的登录凭据   不要这样做,这是不冷静的。

唯一的问题是message.error()(可以理解)需要request作为第一个参数,并且在我踢其他用户时,我没有他们的请求对象,我只有用户的对象。

所以我正在研究各种选择。我想我可以编写一个模型来记录这些类型的消息,通过会话ID(我来自每个用户)键入,然后是一些中间件,在每次请求时检查数据库中是否有该会话ID 的任何消息但这似乎真的很浪费,更不用说反干了。必须有一个更好的方法,但我不知道它是什么。

2 个答案:

答案 0 :(得分:1)

我似乎已经以一种相当圆润,黑客的方式解决了这个问题。我会在这里发布,以防其他人看到类似的问题。

首先,我必须将存储后端设置为使用会话而不是默认值。我认为默认是会话,但是通过检查数据库,我没有看到它。

# settings.py
MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'

接下来,我向user.is_logged_in信号添加了一个处理程序:

def kick_my_other_sessions(sender, request=None, user=None, **kwargs):

    from django.contrib.messages import constants
    from django.contrib.messages.storage.base import Message
    from django.contrib.sessions.backends.db import SessionStore
    from django.contrib.sessions.models import Session

    from tracking.models import Visitor

    keys = [v.session_key for v in Visitor.objects.filter(user=request.user).exclude(session_key=request.session.session_key)]
    for session in Session.objects.filter(session_key__in=keys):

        s = SessionStore(session.session_key)

        # Hack to log the user out without expiring the session immediately,
        # otherwise they'll never see their message
        s["_auth_user_id"] = 0

        # The _messages property is a list of Message objects
        s["_messages"] = [Message(constants.ERROR, "You've been logged out because someone else has logged into your account from another computer.")]

        s.save()

就是这样。最初,我刚刚删除了会话,但这个(当然是hackish)方式,我可以注销用户并让他们保留会话,以便他们可以看到他们的消息。

答案 1 :(得分:0)

当我们可以创建这样的消息时非常酷:

user.message_set.create(message='blabla')

现在,这被残酷地带走了,你唯一的选择就是创造一个持续存在的message engine。使用模型。然后,您可以将消息添加到数据库,用户将能够检索它们。