Flask-socketio (на стороне сервера) не получает события

Я играл с 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) ничего не получает.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
652
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что ваши файлы 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>

Вау, наконец-то это работает

Luqman Tuke 18.10.2022 09:10

Другие вопросы по теме