烧瓶 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 逻辑。