Запрос перекрестного происхождения заблокирован: политика того же источника запрещает чтение удаленного ресурса в python в angular socket io

#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)