#angular #python-socketio
#angular #python-socketio
Вопрос:
socketio не может получить данные из python в интерфейс angular, он показывает ошибку как « Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://my ip:3000/socket.io/?EIO=3amp;transport=pollingamp;t=NQtJeHE. (Reason: CORS request did not succeed)
»
while True:
sio.emit('livedata', {data'})
Не получил это в angular из python, socketio выдает указанную выше ошибку
Ответ №1:
python-socketio
по умолчанию применяется политика того же источника. Это означает, что если ваш сервер socketio запущен http://myip:5000
, он будет принимать запросы только от этого источника. Итак, в вашем случае он блокирует запросы от вашего интерфейса angular, потому что запрос поступает из http://myip:3000
Согласно документации python-socketio:
При необходимости можно использовать параметр cors_allowed_origins, чтобы разрешить другие источники. Этот аргумент может быть установлен в строку, чтобы задать один разрешенный источник, или в список, чтобы разрешить несколько источников. Специальное значение ‘*’ может использоваться для указания серверу разрешить все источники, но это следует делать с осторожностью, поскольку это может сделать сервер уязвимым для атак с подделкой межсайтовых запросов (CSRF).
Как исправить:
Инициализируйте свой python-socketio
сервер списком источников, с которых вы хотите разрешить запросы. В данном случае это ваше приложение angular и ваше приложение python. Используйте что-то вроде следующего (при условии, что ваш сервер python работает локально на порту 5000, а angular — на 3000):
sio = socketio.Server(cors_allowed_origins=['http://myip:5000', 'http://myip:3000'])
И теперь это должно сработать.
Примечание: вы также можете сделать следующее, но при этом будут приниматься запросы от ВСЕХ источников, поэтому будьте осторожны, поскольку это может открыть вас для атак CSRF:
sio = socketio.Server(cors_allowed_origins='*')
Дополнительное примечание: если вы используете flask-socketio
(оболочку расширения Flask python-socketio
), просто передайте тот же cors_allowed_origins
аргумент в SocketIO
объект при инициализации (или init_app
метод). Вам также необходимо включить CORS в вашем приложении Flask — я бы рекомендовал использовать и читать документацию по расширению Flask-CORS — это делает это очень простым.
Комментарии:
1. Как этот emit работает с определенным портом, используя сервер ввода-вывода сокета, который работает с клиентом?
2. Извините, я не понимаю, о чем вы спрашиваете. SocketIO будет отправляться подключенным клиентам (независимо от их порта)… вам решать, кому разрешено подключаться при инициализации сервера… который я описал вам выше. Причина, по которой он сейчас не работает, заключается в том, что конфигурация сервера SocketIO по умолчанию не позволяет
http://myip:3000
подключаться, поскольку он находится за пределами источника, на котором работает ваш сервер Python (скорее всегоhttp://myip:5000
).3. Сервер не может обрабатывать более одного соединения одновременно, почему? Я упоминаю сокет. прослушивание (100), но соединение происходит одновременно только для одной конечной точки
Ответ №2:
Использование потоков в асинхронном режиме для многопроцессорной обработки и cros для обеспечения безопасности может использовать
cors_allowed_origins=[‘*’] для всех
import threading
socketio = SocketIO(app,cors_allowed_origins=['http://pythonserver-ip:port','http://angular-ip:4200'],async_mode='threading')
для сна в цикле while используйте этот код вместо time.sleep(2)
socketio.sleep(2)