2012-04-03 62 views
0

我有一些漂亮的代码,在用户登录时,发现任何其他用户以该用户身份登录并将其注销。它工作得很好,但它没有提供任何关于为什么这些人不再登录的迹象,所以我试图用Django的消息系统来补救。如何使用Django消息传递来提醒其他用户?

您已注销,因为某人已共享其登录凭证。
不要这样做,它不冷静。

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

所以我正在处理选项。我想我可以写一个模型来记录这些类型的消息,以会话ID(我拥有每个用户)为关键字,然后是一些中间件,它检查数据库是否有任何消息,对于每个请求的会话编号但似乎真的很浪费,更不用说反DRY了。必须有更好的方式来做到这一点,但我不知道它到底是什么。

回答

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)的方式,我可以注销用户并让他们保留会话,以便他们可以看到他们的消息。

0

这是很酷的时候,我们可以像这样创建的消息:

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

现在,这个惨遭带走,你唯一的选择是创建一个message engine是坚持即。使用模型。然后,您可以将消息添加到数据库,并且用户将能够检索它们。

相关问题