django-channel: различать разные `AnonymousUser`s - PullRequest
0 голосов
/ 05 июля 2018

К сожалению, я использую каналы django-каналов 1.1.8, так как я пропустил все Обновление каналов 2.0. Обновление сейчас нереально, так как мы только что запущен, и это займет некоторое время, чтобы выяснить правильно.

Вот моя проблема:

Я использую * message.user.id *, чтобы различать аутентифицированные пользователи, которым я должен отправлять сообщения. Однако есть случаи, когда я буду необходимо отправлять сообщения не прошедшим проверку подлинности пользователям - и это сообщение зависит от внешнего вызова API. Я сделал это в ws_connect () :

@channel_session_user_from_http
def ws_connect(message):
    # create group for user
    if str(message.user) == "AnonymousUser":
        user_group = "AnonymousUser" + str(uuid.uuid4())
    else:
        user_group = str(message.user.id)


    print(f"user group is {user_group}")
    Group(user_group).add(message.reply_channel)
    Group(user_group).send({"accept": True})
    message.channel_session['get_user'] = user_group

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

Это вообще достижимо? Сейчас я не могу получить доступ к чему-либо установленному в ws_connect на мой взгляд.

РЕДАКТИРОВАТЬ: Следуя совету Kagronick, я попробовал это:

@channel_session_user_from_http
def ws_connect(message):
    # create group for user

    if str(message.user) == "AnonymousUser":
        user_group = "AnonymousUser" + str(uuid.uuid4())
    else:
        user_group = str(message.user.id)

    Group(user_group).add(message.reply_channel)
    Group(user_group).send({"accept": True})
    message.channel_session['get_user'] = user_group
    message.http_session['get_user'] = user_group
    print(message.http_session['get_user'])
    message.http_session.save()

Однако http_session равно None, когда пользователь AnonymousUser. Другие декораторы не помогли.

Ответы [ 2 ]

0 голосов
/ 07 июля 2018

РЕДАКТИРОВАТЬ: к сожалению, это работает только локально, но не на производстве. когда AnonymousUser, message.http_sesssion не существует.

user kagronick вывел меня на правильный путь, где он указал, что message имеет атрибут http_session. Однако кажется, что http_session всегда None в ws_connect, когда пользователь является AnonymousUser, что противоречит нашей цели.

Я решил это, проверив, является ли пользователь Anonymous в представлении , и если он есть, это означает, что у него нет сеанса (или, по крайней мере, каналы не могут его видеть) , инициализируйте один и присвойте ключу get_user значение "AnonymousUser" + str(uuid.uuid4()) (этот способ ранее был сделан для потребителя).

После того, как я это сделал, каждый раз, когда ws_connect вызывается, message будет иметь атрибут http_session: либо идентификатор пользователя при входе в систему, либо AnonymousUser-uuid.uuid4().

0 голосов
/ 06 июля 2018

Да, вы можете сохранить в сеансе и получить к нему доступ в представлении. Но вам нужно использовать http_session, а не сеанс канала. Используйте декоратор @http_session или @channel_and_http_session. Вам может понадобиться вызвать message.http_session.save () (я не помню, сейчас я на 2-м канале). Но после этого вы сможете увидеть группу пользователей в представлении.

Кроме того, использование группы для этого является своего рода излишним. Если в группе будет только 1 пользователь, поместите response_channel в сеанс и сделайте что-то вроде Channel(request.session['reply_channel']).send() в представлении. Таким образом, не нужно искать одного пользователя, который находится в группе и может отправлять непосредственно пользователю.

Если это решит вашу проблему, отметьте ее как принятую.

...