Я решил проблему. Во-первых, вы должны передать socketio нормальные cors.
sio = socketio.AsyncServer(async_mode='aiohttp', cors_allowed_origins='*')
Когда sio присоединяется к «app», для socket.io добавляется маршрут с заголовком cors с «» - это означает, что заголовок «Access-Control-Allow-Origin» отображается в ответе HTTP с «» "для разрешенного домена. (Вы можете контролировать разрешенный домен, если хотите.)
Итак, это часть 1 всех ваших проблем. Есть часть 2. Чтобы обслужить "/" или "/index.html", вам нужно добавить тот же заголовок cors для aiohttp. Другими словами, изменение выше одной строки добавляет заголовок cors только для socket.io, а не для aiohttp.
Чтобы aiohttp имел заголовок cors, вам нужно добавить пакет aiohttp_cors, импортировать модуль aiohttp_cors и добавить заголовок cors к каждому маршруту, насколько я понимаю. После того, как вы добавили все маршруты к маршрутизатору, вы делаете:
import aiohttp_cors
cors = aiohttp_cors.setup(app)
# app.router.add_routes(routes) if you have routes
# app.router.add_static("/", rootdir) if you want to serve static, and this has to be absolutely the last route since it's the root. Adding any route after this becomes ignored as '/' matches everthing.
for resource in app.router._resources:
# Because socket.io already adds cors, if you don't skip socket.io, you get error saying, you've done this already.
if resource.raw_match("/socket.io/"):
continue
cors.add(resource, { '*': aiohttp_cors.ResourceOptions(allow_credentials=True, expose_headers="*", allow_headers="*") })
Чтобы сделать это немного проще, я отправляю запрос в aiohttp.