2012-04-03 8 views
0

Ich habe einen raffinierten Code, der bei der Benutzeranmeldung einen anderen Benutzer als diesen Benutzer anmeldet und ihn ausloggt. Es funktioniert ganz gut, aber es gibt keinen Hinweis darauf, warum diese Leute nicht mehr eingeloggt sind, also versuche ich das mit Djangos Messaging-System zu beheben.Wie verwende ich Django Messaging, um andere Benutzer zu warnen?

Sie haben abgemeldet worden, weil jemand ihre Anmeldeinformationen zu teilen ist.
Tun Sie das nicht, es ist uncool.

Das einzige Problem ist, dass message.error() (verständlicherweise) request als erstes Argument erfordert, und an dem Punkt, an dem ich anderen Benutzern bin Tritte, ich habe nicht ihre Anfrage Objekte, ich habe nur die Tritte Benutzerobjekt.

Also arbeite ich an Optionen. Ich denke, ich könnte ein Modell schreiben, um diese Art von Nachrichten zu protokollieren, die von Sitzungs-ID (die ich von jedem Benutzer habe), und dann einige Middleware, die die DB für alle Nachrichten für diese Sitzung ID auf jede Anfrage überprüft, aber das scheint wirklich verschwenderisch, ganz zu schweigen von Anti-DRY. Es muss einen besseren Weg geben, es zu tun, aber ich weiß nicht, was es ist.

Antwort

1

Ich habe das auf ziemlich runde, hackische Weise gelöst. Ich poste es hier für den Fall, dass jemand mit einem ähnlichen Problem auftaucht.

Zuerst musste ich das Speicher-Backend so einstellen, dass es Sitzungen statt der Standardeinstellungen verwendet. Ich dachte, der Standard wäre Sitzungen, aber von der Überprüfung der Datenbank habe ich es nicht gesehen.

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

Als nächstes habe ich einen Handler zum user.is_logged_in Signal:

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() 

Und das ist es. Ursprünglich habe ich gerade die Sitzung gelöscht, aber auf diese (zugegebenermaßen hackische) Weise kann ich den Benutzer abmelden und sie die Sitzung behalten lassen, damit sie ihre Nachricht sehen können.

0

Es war ziemlich cool, wenn wir Meldungen wie diese schaffen könnte:

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

Nun, dies brutal weggenommen wurde, ist Ihre einzige Möglichkeit ist, ein message engine, die also weiterhin bestehen zu erstellen. mit Modellen. Dann können Sie Nachrichten zur Datenbank hinzufügen und der Benutzer kann sie abrufen.

Verwandte Themen