- Python Falcon 教程
- Python Falcon - 首页
- Python Falcon - 简介
- Python Falcon - 环境搭建
- Python Falcon - WSGI vs ASGI
- Python Falcon - Hello World (WSGI)
- Python Falcon - Waitress
- Python Falcon - ASGI
- Python Falcon - Uvicorn
- Python Falcon - API 测试工具
- 请求 & 响应
- Python Falcon - 资源类
- Python Falcon - 应用类
- Python Falcon - 路由
- Falcon - 后缀响应器
- Python Falcon - Inspect 模块
- Python Falcon - Jinja2 模板
- Python Falcon - Cookie
- Python Falcon - 状态码
- Python Falcon - 错误处理
- Python Falcon - Hook
- Python Falcon - 中间件
- Python Falcon - CORS
- Python Falcon - WebSocket
- Python Falcon - SQLAlchemy 模型
- Python Falcon - 测试
- Python Falcon - 部署
- Python Falcon 有用资源
- Python Falcon - 快速指南
- Python Falcon - 有用资源
- Python Falcon - 讨论
Python Falcon - WebSocket
WebSocket 是客户端和服务器之间的一种持久连接,用于在两者之间提供双向、全双工通信。通信通过单个 TCP/IP 套接字连接在 HTTP 上进行。它可以看作是 HTTP 的升级,而不是协议本身。
HTTP 的局限性之一在于它是一种严格的半双工或单向协议。而 WebSocket 则允许我们发送基于消息的数据,类似于 UDP,但具有 TCP 的可靠性。WebSocket 使用 HTTP 作为初始传输机制,但在收到 HTTP 响应后保持 TCP 连接存活。同一个连接对象可以用于客户端和服务器之间的双向通信。因此,可以使用 WebSocket API 构建实时应用程序。
Falcon 的 WebSocket 支持仅适用于 ASGI 应用程序。为了提供 WebSocket 功能,资源类应该具有on_websocket() 响应器协程。
async def on_websocket(self, req, ws): . . .
WebSocket 请求也可以被 Hook 和中间件拦截。它传递的是falcon.asgi.WebSocket 对象,而不是 Response 对象。
WebSocket 在 Falcon 中是如何工作的?
下面的例子演示了 WebSocket 在 Falcon 应用程序中的工作方式。首先,我们有一个on_get() 响应器来渲染模板。
示例
客户端浏览器显示一个带有文本字段和按钮的表单,单击按钮时,将创建一个websocket 对象,并触发on_websocket() 响应器。它接收用户输入的消息,并在前面加上“The message text was”前缀后将其回显给客户端。
import falcon import falcon.asgi import jinja2 html = """ <!DOCTYPE html> <html> <head> <title>Chat</title> </head> <body> <script> var ws = new WebSocket("ws://127.0.0.1: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 服务器并访问https://127.0.0.1:8000/ws URL 来显示聊天表单。
输入一些文本并按下发送按钮。
广告