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以显示聊天表单。
输入一些文本并按下 发送 按钮。