问题描述
我有以下代码用于基于此处组合不同端点的 Sanic hello world:
I have the following code for a Sanic hello world based off combining different endpoints here:
- https://sanic.readthedocs.io/en/latest/sanic/response.html
- https://sanic.readthedocs.io/en/latest/sanic/websocket.html
代码是:
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"工作正常,但是
The routes "/" and "/html" work fine, but
http://0.0.0.0:8000/feed
产生:
Error: Invalid websocket request
和 "/html2" 可以很好地呈现页面,但不会登录到控制台,显示在调试器中:
and "/html2" renders the page fine, but doesn't log to console, showing in the debugger:
Firefox can’t establish a connection to the server at wss://0.0.0.0:8000/feed.
我应该改变或添加什么来制作一个可行的 websocket 端点,它也可以很好地与 http 端点配合使用?
What should I change or add to make a viable websocket endpoint that plays nicely with the http ones, too?
推荐答案
在客户端 html 中使用 0.0.0.0 作为端点没有任何意义,而且您没有使用 SSL,因此您想使用 ws://而不是 wss://.换句话说,
Using 0.0.0.0 as your endpoint within your client html doesn't make any sense and you're not using SSL so you want to use ws:// rather than wss://. In other words,
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)
这篇关于如何让 Sanic 响应 http 和 ws?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!