如何从Twisted Root Resource访问Autobahn WebSocketResource?
问题描述:
我一直在寻找许多示例来演示如何访问高速公路Twisted WebSocketResource,但似乎无法找到显示此示例的示例。如何从Twisted Root Resource访问Autobahn WebSocketResource?
我从这个例子Autobahn Twisted WebSocketResource example了解到你实例化了一个WebSocketServerFactory
,设置websocket协议,然后使用WebSocketResource(factory)
来创建websocket资源。一旦你的WebSocket的资源,这可以在主扭曲Web资源路径上添加创建Site
情况下,像这样前:
class WebSocketProtocol(WebSocketServerProtocol):
def onConnect(self, request):
print("WebSocket connection request: {}".format(request))
def onMessage(self, payload, isBinary):
self.sendMessage(payload, isBinary)
class HttpResource(resource.Resource):
isLeaf = True
def render_GET(self, request):
return "<html><h1>Hello World!</h1></html>"
factory = WebSocketServerFactory(u"ws://127.0.0.1:8000")
factory.protocol = WebSocketProtocol
ws_resource = WebSocketResource(factory)
root = HttpResource()
root.putChild(b"ws", ws_resource)
site = Site(root)
所以我的理解是,在ws://127.0.0.1:8000/ws
所有请求都将被路由到WebSocket的资源。然而,/ws
资源似乎并未被浏览器发现。 GET请求正常工作,但websocket请求不会。
至于WebSocket的请求去,这里是事件,我相信应该可以解决这个问题的流量(我只是不知道如何实现它们):
- 浏览器发送一个
GET
请求与Upgrade
到头部的websocket。 -
render_GET
HttpResource
上的方法需要在请求中识别出这一点,并将响应代码设置为101和/或找到ws
资源来处理数据通信。
如何从根资源切换到子资源,以便websocket可以处理websocket请求?
我最初的想法是在根资源上使用getChild
方法来检查ws
。如果名称是ws
,则返回websocket资源。我还在这里阅读:Twisted Web (isLeaf),根资源类HttpResource
下的isLeaf
属性不能存在,或者您无法访问根资源上的子项。
任何帮助将是伟大的。提前感谢您提供的任何帮助。
干杯!
布赖恩
答
一段时间后,阅读有关高速公路和扭曲,我在的代码片段工作的到来。如果需要,高速公路的onConnect
方法会处理请求并将峰值转换为标题。
class WebSocketProtocol(WebSocketServerProtocol):
def onConnect(self, request):
custom_header = {}
if request.headers['sec-websocket-key']:
custom_header['sec-websocket-protocol'] = 'graphql-ws'
return (None, custom_header)
def onMessage(self, payload, isBinary):
self.sendMessage(payload, isBinary)
class HttpResource(Resource):
isLeaf = True
def render_GET(self, request):
return "<html><h1>Hello World!</h1></html>"
factory = WebSocketServerFactory()
factory.protocol = WebSocketProtocol
ws_resource = WebSocketResource(factory)
root = Resource()
root.putChild("", HttpResource())
root.putChild(b"ws", ws_resource)
site = Site(root)
reactor.listenTCP(8000, site)
reactor.run()