Как использовать сообщения Django для оповещения других пользователей? - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть отличный код, который при входе пользователя находит любого другого пользователя, вошедшего в систему под этим именем, и выходит из него. Он работает просто отлично, но не дает никаких указаний на то, почему эти люди больше не входят в систему, поэтому я пытаюсь исправить это с помощью системы обмена сообщениями Django.

Вы вышли из системы, потому что кто-то поделился своими учетными данными.
Не делай этого, это не круто.

Единственная проблема заключается в том, что message.error() (по понятным причинам) требует request в качестве первого аргумента, и в тот момент, когда я пинаю других пользователей, у меня нет объектов запроса, у меня есть только пинать объект пользователя.

Так что я работаю над опциями. Я полагаю, что я мог бы написать модель для регистрации сообщений такого рода с ключом идентификатора сеанса (который я имею от каждого пользователя), а затем какое-то промежуточное программное обеспечение, которое проверяет базу данных на наличие любых сообщений для этого идентификатора сеанса при каждом запросе но это кажется действительно расточительным, не говоря уже о анти-СУХОЙ. Должен быть лучший способ сделать это, но я пока не знаю, что это такое.

Ответы [ 2 ]

1 голос
/ 04 апреля 2012

Я, кажется, решил это довольно круглым, хакерским способом.Я опубликую это здесь на тот случай, если кто-нибудь еще посмотрит с подобной проблемой.

Сначала я должен был настроить бэкэнд хранилища на использование сессий, а не на то, что по умолчанию.Я думал, что по умолчанию были сеансы, но из проверки базы данных я ее не увидел.

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

И это все.Первоначально я просто удалил сеанс, но таким (по общему признанию хакерским) способом я могу выйти из системы и позволить ему сохранить сеанс, чтобы они могли видеть свое сообщение.

0 голосов
/ 03 апреля 2012

Было довольно круто, когда мы могли создавать сообщения вроде этого:

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

Теперь это было жестоко убрано, ваш единственный вариант - создать механизм сообщений , который сохраняется, т.е.,используя модели.Затем вы можете добавить сообщения в базу данных, и пользователь сможет получить их.

...