ChannelBox这是Starlette框架的一个简单工具,允许您向多个频道组发送消息。
channel-box的Python项目详细描述
通道盒
ChannelBox这是Starlette框架的一个简单工具,允许您向多个频道组发送消息。在
使用示例:
- 聊天
- 来自后端的通知
- 警报
https://github.com/Sobolev5/channel-box
如何使用它
要安装运行:
^{pr2}$修改网址.py公司名称:
fromstarlette.routingimportRoutefromstarlette.routingimportWebSocketRoutefrom.viewsimportChatViewfrom.viewsimportChatSocketroutes=[Route("/",endpoint=ChatView),WebSocketRoute("/chat_ws",ChatSocket),]
将以下行添加到视图.py文件:
fromstarlette.endpointsimportHTTPEndpointfromstarlette.responsesimportHTMLResponsefromchannel_boximportChannelEndpointfromchannel_boximportchannel_groupshtml="""<!DOCTYPE html><html> <head> <title>ws</title> </head> <body> <h1>WebsocketChannelEndpoint</h1> <form action="" onsubmit="sendMessage(event)"> <label>group_id: </label><input type="text" id="groupId" autocomplete="off" value="1"><br/> <label>username: </label><input type="text" id="username" autocomplete="off" value="test_user1"><br/> <label>message: </label><input type="text" id="messageText" autocomplete="off" value="test_message1"><br/> <button>Send</button> </form> <ul id='messages'> </ul> <script> var ws = new WebSocket("ws://localhost/chat_ws"); ws.onmessage = function(event) { console.log('Message receivied %s', event.data) var messages = document.getElementById('messages'); var message = document.createElement('li'); var data = JSON.parse(event.data); message.innerHTML = `<strong>${data.username} :</strong> ${data.message}`; messages.appendChild(message); }; function sendMessage(event) { var username = document.getElementById("username"); var group_id = document.getElementById("groupId"); var input = document.getElementById("messageText"); var data = { "group_id": group_id.value, "username": username.value, "message": input.value, }; console.log('Message send %s', data) ws.send(JSON.stringify(data)); event.preventDefault(); } </script> </body></html>"""classChatView(HTTPEndpoint):asyncdefget(self,request):channel_groups.groups_show()awaitchannel_groups.group_send("group_1",{"username":"ChatView","message":"Hello from ChatView"})returnHTMLResponse(html)classChatSocket(ChannelEndpoint):def__init__(self,*args,**kwargs):super().__init__(*args,**kwargs)self.expires=1600self.encoding="json"asyncdefon_receive(self,websocket,data):group_id=data["group_id"]message=data["message"]username=data["username"]ifmessage.strip():self.get_or_create(group_id)payload={"username":username,"message":message,}awaitself.group_send(payload)
ChannelEndpoint方法
更改编码和初始过期时间(默认值为自我过期=60*60*24,自我编码=“json”):
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.expires = 1600 self.encoding = "json"
按名称获取或创建组(仅允许使用ASCII符号):
self.get_or_create('my_chat_1') self.get_or_create('alert_channel_1')
向组发送消息:
await self.group_send('my_chat_1', {"username": "New User", "message": "Hello world"}) await self.group_send('alert_channel_1', {"username": "New User", "message": "Hello world"})
频道组方法
从代码的任何部分向任何组发送消息:
await channel_groups.group_send('my_chat_1', {"username": "New User", "message": "Hello world"})
显示组和频道:
channel_groups.groups_show()
刷新所有组和通道:
channel_groups.groups_flush()
工作实例
https://github.com/Sobolev5/starlette-vue-backend/tree/master/apps/chat
http://backend.starlette-vue.site/chat/chat1/
http://backend.starlette-vue.site/chat/chat2/
- 项目
标签: