Я играл с flask-socketio, но не могу заставить его работать.
Каталог моего проекта настроен следующим образом:
Project
├── app
│ └── main
│ │ └── __init__.py
│ │ └── events.py
│ │ └── portal
│ │ └── __init__.py
│ │ └── routes.py
│ └── templates
│ | └── index.html
│ └── __init__.py
└── run.py
└── __init__.py
Мой run.py
файл:
from app import create_app, socketio
app = create_app()
if __name__ == "__main__":
socketio.run(app, debug=True)
app\__init__.py
файл
from flask import Flask
from app.main.admin.routes import admin
from app.main.api.routes import api
from app.main.website.routes import website
from app.main.portal.routes import portal
import os
from flask_socketio import SocketIO
socketio = SocketIO()
def create_app():
app = Flask(__name__)
app.secret_key = os.urandom(24)
# Initialise extensions
socketio.init_app(app)
with app.app_context():
app.register_blueprint(website)
app.register_blueprint(portal, url_prefix = "/portal")
return app
events.py
:
from .. import socketio
@socketio.on('hello')
def handle_hello(data):
print(data)
И, наконец, alert.html
:
<script src = "http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type = "text/javascript"></script>
<script type = "text/javascript" src = "//code.jquery.com/jquery-1.4.2.min.js"></script>
<script type = "text/javascript" src = "//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
<script>
var socket = io.connect('http://' + document.domain + ':' + location.port);
function hey() {
socket.emit('hello', {'data': 'hello peter r'});
}
</script>
</head>
<body>
<button onclick = "hey()">Hello</button>
</body>
В events.py кажется, что приветствие события никогда не принимается, и ничего не печатается. Я предполагаю, что это проблема с тем, как я импортировал файл, но я не вижу никаких проблем в коде. Может кто-нибудь помочь?
Обновление: я добавил событие socket.on('connect')
в свой код alert.html (клиент), и клиент подключается, но сервер (events.py) ничего не получает.
Проблема в том, что ваши файлы events.py
никогда не доступны вашему приложению. Он никак не импортируется и не открывается. Из-за этого обработчик никогда не регистрируется.
Нам не хватает части вашего кода, поэтому я сделал минимальный рабочий пример. Просто поместите все это в одну папку:
запустить.py
from main import create_app, socketio
# Import the handler, you don't actually have to do anything with it, just import
import events
# Create the app
app = create_app()
if __name__ == "__main__":
# Run the app on a specific port
socketio.run(app, debug=True, port=5006)
main.py
import os
from flask import Flask
from flask_socketio import SocketIO
# Create the socketio app
socketio = SocketIO()
def create_app() -> Flask:
# Create a Flask app
app = Flask(__name__, static_folder = "./")
app.secret_key = os.urandom(24)
# Initialise extensions
socketio.init_app(app)
# Register some endpoints, in this case just serve index.html
@app.route('/')
def index():
return app.send_static_file('index.html')
return app
события.py
from main import socketio
@socketio.on('hello')
def handle_hello(data):
print(data)
index.html
<html>
<head>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.1/socket.io.js" integrity = "sha512-AcZyhRP/tbAEsXCCGlziPun5iFvcSUpEz2jKkx0blkYKbxU81F+iq8FURwPn1sYFeksJ+sDDrI5XujsqSobWdQ= = " crossorigin = "anonymous"></script>
<script>
const socket = io.connect('http://localhost:5006/');
// Show a message when we're connected to the server
socket.on('connect', () => console.info('We\'re connected!'));
function hey() {
socket.emit('hello', {
'data': 'Hello Peter!'
});
}
</script>
</head>
<body>
<button onclick = "hey()">Hello</button>
</body>
</html>
Вау, наконец-то это работает