烧瓶 SocketIO + Apache
Flask SocketIO + Apache
我已经成功创建了一个在 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 对这个问题的回答:,它说使用 Apache 的网络服务器不是一个好主意。我不太了解网络服务器的工作原理。我做错了什么吗?答案还说 Apache 不支持网络套接字。那么我的应用程序怎么能正常工作呢?如果有人能向我解释这件事,我将不胜感激。
您的示例有效,因为您仅通过 Apache 提供 HTML 文件,Flask-SocketIO 服务器仍然 运行 在端口 5000 上单独运行。
目前 difficult/impossible 要做的是让 Socket.IO 连接通过 Apache 然后到达服务器,这是大多数人喜欢的方式。
您实际上是 运行 两个 Web 服务器,Apache 在端口 80/443 上用于您的 HTML 端口 5000 上的 Flask-SocketIO 用于您的 Python 逻辑。
我已经成功创建了一个在 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 对这个问题的回答:
您的示例有效,因为您仅通过 Apache 提供 HTML 文件,Flask-SocketIO 服务器仍然 运行 在端口 5000 上单独运行。
目前 difficult/impossible 要做的是让 Socket.IO 连接通过 Apache 然后到达服务器,这是大多数人喜欢的方式。
您实际上是 运行 两个 Web 服务器,Apache 在端口 80/443 上用于您的 HTML 端口 5000 上的 Flask-SocketIO 用于您的 Python 逻辑。