Skip to content

biohub.core.websocket

hsfzxjy edited this page Aug 8, 2017 · 2 revisions

概述

本模块封装了与 websocket 有关的所有操作。

概念释义

handler name

一个 handler name 是一个字符串,可以与 多个 handler 建立对应关系。前端发出的每一条消息必须指定一个 handler name。注意 __connect__ 被视为保留名称。

message

一个 message 代表一条来自前端的消息。message 有 handler_namedata 属性。

handler

一个 handler 是一个函数,只接受一个参数 message

示例:

from biohub.core.websocket import register_handler, register_connected

# 此处 'test' 是 handler name, test_handler 是 handler, message 对象包含来自前端的数据。
# 假设前端发送了 { 'handler': 'test', 'data': 'hello' }
@register_handler('test')
def test_handler(message):
    print(message.handler_name, message.data) # test hello
    print(message.user) # 发起连接的 user
    message.reply('world')
    # 回复一条消息,实际上是发送了 { 'handler': 'test', 'data': 'world' }

# 此 handler 会在 websocket 连接建立时触发
@register_connected
def connected_handler(message):
    print(message.handler_name) # __connect__
    with message.patch_handler_name('test'): # 暂时改变 handler_name
        message.reply('welcome')
        # 实际发送了 { 'handler': 'test', 'data': 'welcome' }

handler 外发送消息的示例:

from biohub.core.websocket.tool import Broadcaster

b = Broadcaster('test') # 'test' 为 handler name

class Article(models.Model):

    # ...

    def save(self):
        b.broadcast_user(self.author, 'created!') # 发给特定用户
        b.broadcast_user([self.author], 'created!') # 发给若干用户
        b.broadcast('created!') # 发给所有用户

流程

References

class Message

.handler_name

.data

.packed_data

原始数据,等价于 dict(data=message.data, handler=message.handler_name)

.reply(data)

原路回应一条消息。

.broadcast(data)

全局广播消息。

.broadcast_user(user, data)

发送消息给指定用户。

.broadcast_users(user, data)

发送消息给一组用户。

.patch_handler_name(handler_name)

返回一个 context manager,在此上下文中,message.handler_name 被修改为指定的 handler_name

class Broadcaster

.broadcast(data)

全局广播消息。

.broadcast_user(user, data)

发送消息给指定用户。

.broadcast_users(user, data)