我已经成功创建了一个在eventlet服务器上运行的Flask-SocketIO应用程序。然后,我将该网页移至Apache Web服务器。我只是删除了myapp.py中呈现模板的部分,并将index.html文件放置在Apache的/ www / html目录中。这是代码:
myapp.py:
from flask import Flask
from flask_socketio import SocketIO, emit
import eventlet
eventlet.monkey_patch()
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
io = SocketIO(app, cors_allowed_origins="http://localhost")
clients = []
@io.on('connected')
def connected():
clients.append(request.sid)
print("client connected")
print(request.sid)
@io.on('disconnect')
def disconnect():
clients.remove(request.sid)
print("client disconnected")
print(request.sid)
if __name__ == '__main__':
io.run(app, host='localhost', port=5000)
index.html:
<html>
<br>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js" integrity="sha256-yr4fRk/GU1ehYJPAs8P4JlTgu0Hdsp4ZKrx8bDEDC3I=" crossorigin="anonymous"></script>
</head>
<br>
<body>
<h2>HELLO</h2>
<script>
$("document").ready(function(){
var socket = io.connect('http://localhost:5000');
socket.on('connect', function() {
socket.emit('connected');
});
});
</script>
</body>
</html>
一切正常。但是,然后我阅读了Miguel对以下问题的回答:Using eventlet to manage socketio in Flask,它说使用Apache的Web服务器不是一个好主意。我不太了解Web服务器如何工作。我做错了吗?答案还说,Apache不支持Web套接字。那么我的应用程序如何运作?如果有人可以向我解释这件事,我将非常感谢。
您的示例有效,因为您仅通过Apache提供HTML文件,但Flask-SocketIO服务器仍在端口5000上单独运行。
当前困难/不可能做的是使Socket.IO连接先通过Apache然后再到达服务器,这是大多数人所喜欢的。
您实际上正在运行两个Web服务器,HTML的端口80/443上为Apache,Python逻辑的端口5000上为Flask-SocketIO。