flask-socket和IIS 10版存在配置或代码问题:WebSocket无法连接

时间:2019-06-23 13:58:42

标签: python iis flask websocket flask-sockets

我构建了一个Flask应用程序,该应用程序使用模块flask提供标准的网页,并使用模块flask-socket报告通过这些网页请求的计算。

此安装程序通过独立的flask应用程序运行良好(通过运行app.run()),但无法将其移植到我公司的Web服务器上:我们使用的是配置有fastCGI和模块wfastcgi的Microsoft iis服务器。

根据以下指南完成iis的配置:https://www.storehubs.com/Blog/deploy-python-flask-application-iis/。 部署Flask应用程序后,网页将按预期提供。但是WebSockets无法连接,我得到了:

与'ws:// localhost / echo'的WebSocket连接失败:WebSocket握手期间出错:意外的响应代码:404。

此错误使我得出结论,我的服务器上有响应,但请求未到达我的应用程序。

在网络上搜索时,有人说禁用iss WebSocket处理程序可以达到目的,但事实并非如此。在我的applicationHost.config中:

    <system.webServer>
        <webSocket enabled="false" />
    </system.webServer>

为了测试,我使用了两个文件:

sample.py:

from flask import Flask, render_template
from flask_sockets import Sockets

app = Flask(__name__)
app.debug = True

sockets = Sockets(app)

@sockets.route('/echo')
def echo_socket(ws):
    print(ws.environ['QUERY_STRING'])
    while True:
        message = ws.receive()
        if message is None: 
            break
        ws.send(message[::-1])

@app.route('/', methods=['GET'])
def echo_test():
    return render_template('echo_test.html')

if __name__ == '__main__':
    app.run()

echo_test.html:

    <!DOCTYPE html>
    <html>
      <head>
        <script type="text/javascript">
            function ws_url(s) {
                var l = window.location;
                path = l.pathname.substring(0, l.pathname.lastIndexOf("/"));
                return ((l.protocol === "https:") ? "wss://" : "ws://") + l.host + path + s;
            }
            var u = ws_url('/echo')
            var ws = new WebSocket(u);
            ws.onopen = function() {
                ws.send("socket open");
            };
            ws.onclose = function(evt) {
                alert("socket closed");
            };
            ws.onmessage = function(evt) {
                alert(evt.data);
            };
        </script>
      </head>
      <body>
      <button type="button" onclick="SendMessage()">Click Me!</button>
          <script type="text/javascript">
           function SendMessage() {
               ws.send("button clicked!\nHoura!")
           }
        </script>
        <br><br>
      <button type="button" onclick="CloseSocket()">Close!</button>
          <script type="text/javascript">
           function CloseSocket() {
               ws.close()
           }
        </script>

      </body>
    </html>

在我的python脚本中是否缺少一些由Flask-Sockets处理的WebSocket的代码,或者是IIS方面的配置问题?

真的期待着这个看似基本的问题的答案。

0 个答案:

没有答案