Python Falcon Websocket

Python Falcon Websocket

WebSocket 是客户端和服务器之间的持久性连接,在两者之间提供双向、 全双工 的通信。通信是在HTTP上通过一个TCP/IP套接字连接进行的。它可以被看作是HTTP的升级,而不是一个协议本身。

HTTP的局限性之一是,它是一个严格的半双工或单向的协议。另一方面,通过WebSockets,我们可以发送基于消息的数据,类似于UDP,但具有TCP的可靠性。WebSocket使用HTTP作为初始传输机制,但在收到HTTP响应后保持TCP连接的活力。同样的连接对象,它可以用于客户端和服务器之间的双向通信。因此,可以使用WebSocket APIs构建实时应用程序。

Falcon的Websocket支持仅适用于ASGI应用程序。为了提供Websocket功能,资源类应该有 on_websocket() responder coroutine。

async def on_websocket(self, req, ws):
   . . .

Websocket请求也可以被钩子和中间件截获。传递的不是 Response 对象,而是 falcon.asgi.WebSocket 对象。

WebSocket在Falcon中是如何运作的

下面的例子演示了WebSocket在Falcon应用程序中的功能。首先,我们有一个 on_get() 响应器,可以渲染一个模板。

例子

客户端浏览器显示一个带有文本字段和一个按钮的表单,点击按钮后,创建一个 websocket 对象,并启动 on_websocket() 响应器。它接受用户输入的信息,并将其回传给客户端,前缀为 “信息文本是”。

import falcon
import falcon.asgi
import jinja2
html = """
<!DOCTYPE html>
<html>
   <head>
      <title>Chat</title>
   </head>
   <body>
      <script>
         var ws = new WebSocket("ws://localhost:8000/hello");
         ws.onmessage = function(event) {
            var messages =document.getElementById('messages')
            var message = document.createElement('li')
            var content = document.createTextNode(event.data)
            message.appendChild(content)
            messages.appendChild(message)
         };
         function sendMessage(event) {
            var input = document.getElementById("messageText")
            ws.send(input.value)
            input.value = ''
            event.preventDefault()
         }
      </script>
      <h1>WebSocket Chat</h1>
      <form action="" onsubmit="sendMessage(event)">
         <input type="text" id="messageText" autocomplete="off"/>
         <button>Send</button>
      </form>
      <ul id='messages'></ul>
   </body>
</html>
"""
class HelloResource:
   async def on_get(self, req, resp):
      """Handles GET requests"""
      resp.status = falcon.HTTP_200
      resp.content_type = 'text/html'
      template=jinja2.Template(html)
      resp.body=template.render()
   async def on_websocket(self, req, websocket):
      await websocket.accept()
      while True:
         data = await websocket.receive_text()
         await websocket.send_text(f"Message text was: {data}")
app = falcon.asgi.App()
hello = HelloResource()
app.add_route('/hello', hello)
import uvicorn
if __name__ == "__main__":
   uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)

输出

启动Uvicorn服务器并访问 http://localhost:8000/ws URL以显示聊天表单。

Python Falcon - Websocket

输入一些文本并按下 发送 按钮。

Python Falcon - Websocket

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程