Как Sanic отвечает с помощью http и ws? - PullRequest
0 голосов
/ 06 июля 2019

У меня есть следующий код для здравствующего мира Sanic, основанный на комбинировании различных конечных точек:

Код:

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?

1 Ответ

0 голосов
/ 06 июля 2019

Использование 0.0.0.0 в качестве конечной точки в клиентском html не имеет никакого смысла, и вы не используете 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)
...