我正在寻找一种在烧瓶中为ttyd编写简单代理的方法,该ttyd是开源Web终端(https://github.com/tsl0922/ttyd)。最直接的方法是读取客户端请求并中继到ttyd服务器。但是,当websocket连接时,它将失败。 我的查看功能如下:
@app.route('/')
@app.route('/auth_token.js')
@app.route('/ws')
def ttyd():
if request.path=='/ws':
url = 'ws://192.168.123.172:7681' + request.path
else:
url = 'http://192.168.123.172:7681' + request.path
method = request.method
data = request.data or request.form or None
cookies = request.cookies
headers = request.headers
with closing(
requests.request(method, url, headers=headers, data=data, cookies=cookies)
) as r:
resp_headers = []
for name, value in r.headers.items():
resp_headers.append((name, value))
return Response(r, status=r.status_code, headers=resp_headers)
如您所见,视图功能将处理3个url请求,前两个成功,状态码为200,第三个失败,状态码为500。服务器端的错误代码如下: requests.exceptions.InvalidSchema:找不到'ws://192.168.123.172:7681 / ws'的连接适配器
我还会在两种情况下(使用/不使用代理)检查网络。图片“无代理”表示直接类型“ http://192.168.123.172:7681”,它成功。图片“ with proxy”表示使用烧瓶代理访问ttyd服务器,失败。
由于我是不熟悉Flask和Websocket的人,因此我对结果感到困惑。 sHTTPe flask代理可以处理任何其他http请求(例如,访问google.com),但WebSocket连接失败。
感谢您告诉我原因以及如何解决?
答案 0 :(得分:0)
根据Websockets in Flask,在https://github.com/heroku-python/flask-sockets有一个flask-sockets项目,用于在flask中提供一个websocket端点。要使后端Websocket与服务器建立连接,您不能使用请求,而只能使用Websocket-client,请参阅How do I format a websocket request?。
遇到此问题时,我使用了autobahn-python项目解决了该问题,请参见https://github.com/arska/stringreplacingwebsocketproxy/
干杯, 阿诺