python - 如何让 Sanic 用 http 和 ws 响应?

标签 python websocket sanic

我有以下基于组合不同端点的 Sanic hello world 代码:

代码是:

from sanic import Sanic
from sanic import response
from sanic.websocket import WebSocketProtocol

app = Sanic()

@app.route("/")
async def test(request):
    return response.json({"hello": "world"})


@app.route('/html')
async def handle_request(request):
    return response.html('<p>Hello world!</p>')

@app.websocket('/feed')
async def feed(request, ws):
    while True:
        data = 'hello!'
        print('Sending: ' + data)
        await ws.send(data)
        data = await ws.recv()
        print('Received: ' + data)

@app.route('/html2')
async def handle_request(request):
  return response.html("""<html><head><script>
         var exampleSocket = new WebSocket("wss://0.0.0.0:8000/feed",      "protocolOne");
         exampleSocket.onmessage = function (event) {
         console.log(event.data)};</script></head><body><h1>Hello socket!</h1><p>hello</p></body></html>""")

app.run(host="0.0.0.0", port=8000)
# app.run(host="0.0.0.0", port=8000, protocol=WebSocketProtocol)    # ws 

路线“/”和“/html”工作正常,但是

http://0.0.0.0:8000/feed

产生:

Error: Invalid websocket request

和“/html2”可以正常渲染页面,但不会登录到控制台,显示在调试器中:

Firefox can’t establish a connection to the server at wss://0.0.0.0:8000/feed.

我应该更改或添加什么来创建一个与 http 端点也能很好地配合的可行的 websocket 端点?

最佳答案

在客户端 html 中使用 0.0.0.0 作为端点没有任何意义,并且您没有使用 SSL,因此您需要使用 ws://而不是 wss://。换句话说,

from sanic import Sanic
from sanic import response
from sanic.websocket import WebSocketProtocol

app = Sanic()

@app.websocket('/feed')
async def feed(request, ws):
    while True:
        data = 'hello!'
        print('Sending: ' + data)
        await ws.send(data)
        data = await ws.recv()
        print('Received: ' + data)

@app.route('/html2')
async def handle_request(request):
  return response.html("""<html><head><script>
         var exampleSocket = new WebSocket("ws://" + location.host + '/feed');
         exampleSocket.onmessage = function (event) {
         console.log(event.data)};</script></head><body><h1>Hello socket!</h1><p>hello</p></body></html>""")

app.run(host="0.0.0.0", port=8000)

关于python - 如何让 Sanic 用 http 和 ws 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56911619/

相关文章:

c# - WebSocket 服务器的现代解决方案?

javascript - Reactjs 使用套接字 : rerender when socket receive a message

Python 3.6 - Sanic Motorengine

python - 如何将前缀应用于字典访问?

python - Python动态字段查找的区别

python - 无法将 StructField 与 PySpark 一起使用

python - 异步单元测试 Sanic 应用程序会抛出 RuntimeError : this event loop is already running

python - 在 Python 中从请求中提取 IP

javascript - 将 AutobahnJS (WebSockets) 与 Backbone 解耦

python-3.x - 在 Python 中动态设置 Sanic 日志级别