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/

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
NetBeans中的Java Swing滚动窗格   java如何与具有复合键的表建立关系?   Android中读取文件时java数据丢失   java黄瓜场景。embed在ubuntu机器上不工作?   java从spring mvc控制器操作中,我如何获得请求/响应的访问权限?   java减去两个长值   java选择下一个值firebase 安卓   用于起始和结尾连字符的java正则表达式   Java正则表达式解释   java Lifefay freemarker ADT:方法不可用?   java我怎样才能让我的开关盒作用于JFrame?   java在我的场景中使用连接池的理想方式是什么   java我如何接受jsoup的cookies?   java如何将整数数组更改为字符串数组?   java Android操作\u指针\u向上直到剩余触摸移动时才调用   java为什么gradle会出错?   io如何在java中复制/拆分输入流?   java使JButton不可见,但尊重其原始空间   java Spring提交表单获取复选框值不起作用