ttyd的烧瓶代理

时间:2019-01-07 06:24:31

标签: python flask proxy

我正在寻找一种在烧瓶中为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服务器,失败。

没有代理 enter image description here

有代理 enter image description here

由于我是不熟悉Flask和Websocket的人,因此我对结果感到困惑。 sHTTPe flask代理可以处理任何其他http请求(例如,访问google.com),但WebSocket连接失败。

感谢您告诉我原因以及如何解决?

1 个答案:

答案 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/

干杯, 阿诺