我构建了一个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方面的配置问题?
真的期待着这个看似基本的问题的答案。