Creé con éxito una aplicación Flask-SocketIO que se ejecuta en el servidor eventlet. Luego moví la página web al servidor web Apache. Acabo de eliminar la parte de myapp.py donde se representó la plantilla y coloqué el archivo index.html en el directorio /www/html de Apache. Aquí está el código:
miaplicacion.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)índice.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>Todo funciona bien. Pero luego leí la respuesta de Miguel a esta pregunta: Usar eventlet para administrar socketio en Flask , que dice que usar el servidor web de Apache no es una buena idea. No entiendo muy bien cómo funcionan los servidores web. ¿Lo que hice fue algo incorrecto? La respuesta también dice que Apache no admite sockets web. Entonces, ¿cómo es que mi aplicación funciona? Estaré muy agradecido si alguien puede explicarme este asunto.
Su ejemplo funciona porque solo está sirviendo su archivo HTML a través de Apache, el servidor Flask-SocketIO todavía se ejecuta solo en el puerto 5000.
Lo que actualmente es difícil/imposible de hacer es hacer que las conexiones Socket.IO pasen a través de Apache y luego al servidor, que es lo que prefiere la mayoría de la gente.
Realmente está ejecutando dos servidores web, Apache en los puertos 80/443 para su HTML y Flask-SocketIO en el puerto 5000 para su lógica de Python.