колба-сокетио: before_send/after_send

На flask socket-io, если подключено 2 пользователя, а пользователь 1 отправляет сообщение пользователю 2, как я могу перехватить полезную нагрузку, отправляемую пользователю 2 (в контексте приложения пользователя 2, чтобы изменить его)? Я не хочу изменять полезную нагрузку, отправляемую пользователем1 (это было бы тривиально).

Логически я предполагаю, что должен быть способ перехватить событие в контексте user2 непосредственно перед передачей полезной нагрузки на ws.

Спасибо!


person ptou    schedule 20.01.2016    source источник


Ответы (2)


Обезьяний патч custom_emit_internal сделал свое дело. Надеюсь, при следующем обновлении не сломается!

person ptou    schedule 03.02.2016
comment
Я сделал декоратор и использую его для перехвата функций - person Ajay; 12.03.2016

Я думаю, вы просите функцию на стороне клиента. На сервере единственный контекст, который существует при отправке сообщения, — это контекст отправителя. Обмен происходит так:

client                          | server
---------------------------------------------------------------------------
user1 sends event to server     |
payload includes msg for user2  |
                                |
                                | server decodes the msg payload in
                                | user1's context and sends msg to user2
                                |
user2 receives msg from server  |

Итак, как вы видите, на сервере user2 не является частью этой транзакции, имеет значение только user1. Контекст на стороне сервера для user2 может даже не находиться в одном и том же серверном процессе, поскольку теперь Flask-SocketIO может управлять фермой серверов за балансировщиком нагрузки. Также получателем события может быть не один пользователь, это может быть группа пользователей в комнате или даже все подключенные пользователи.

Я не уверен, что понимаю цель вашего запроса, но если вы хотите уточнить, я могу дать совет.

person Miguel    schedule 26.01.2016
comment
Привет, Мигель - типичный случай: перед отправкой любого сообщения пользователям-получателям (например, которые присоединились к комнате) я хочу проверить, не истек ли срок действия токена получателей. Это должно быть запущено где-то в базовом менеджере сразу после того, как Kombu (на другом сервере) получит событие и будет готов отправить его на ws. Другой случай: мне нужно зашифровать (поверх TLS) с другим ключом для каждого получателя - имеет смысл зашифровать его только перед отправкой в ​​​​конкретный WS. Спасибо за вашу помощь! - person ptou; 26.01.2016
comment
Не было бы вам так же легко проверить токен вашего получателя (получателей) перед отправкой сообщения? Или, что еще лучше, отключать любых пользователей по истечении срока действия их токенов отдельно от отправки сообщений? - person Miguel; 26.01.2016
comment
Привет, Мигель, это только часть того, что мне понадобится. Лучший пример: User1 отправляет полезную нагрузку в комнату с User2 и User3. Пользователь 2 должен получить (полезная нагрузка + конкретная полезная нагрузка для пользователя 2, доступная только в контексте пользователя 2). То же самое для пользователя 3. Как вы думаете, возможен ли обратный вызов менеджера событий непосредственно перед публикацией на WS? Спасибо за помощь Мигель - person ptou; 27.01.2016
comment
Что вы конкретно имеете в виду под контекстом user2? Все, что доступно в сеансе user2, пользователь user2 в клиенте может запросить напрямую, почему это нужно добавлять к сообщению, отправленному другим пользователем? - person Miguel; 27.01.2016
comment
например, давайте представим, что серверу необходимо добавить последовательность сообщений ws, специфичную для любого сообщения, отправленного пользователю2, и этот счетчик находится в памяти на сервере, к которому подключен пользователь2. - person ptou; 27.01.2016