Цель : я пытаюсь настроить CORS для ресурсов в веб-приложении на основе aiohttp с использованием библиотеки aiohttp_cors.В моем приложении есть несколько маршрутов, некоторые из которых являются просто обычными сопрограммами, но некоторые являются представлениями на основе классов (мы переходим к представлениям на основе классов, но пока он находится в смешанном состоянии).Для настройки CORS я обращаюсь к документам aiohttp и aiohttp-cors.
Проблема : При доступе к /api/v1/users
я получаю пустой ответ с этой трассировкой стека на сервере
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/aiohttp/web_protocol.py", line 410, in start
await resp.prepare(request)
File "/usr/local/lib/python3.7/site-packages/aiohttp/web_response.py", line 299, in prepare
await request._prepare_hook(self)
File "/usr/local/lib/python3.7/site-packages/aiohttp/web_request.py", line 712, in _prepare_hook
await app.on_response_prepare.send(self, response)
File "/usr/local/lib/python3.7/site-packages/aiohttp/signals.py", line 35, in send
await receiver(*args, **kwargs) # type: ignore
File "/usr/local/lib/python3.7/site-packages/aiohttp_cors/cors_config.py", line 157, in _on_response_prepare
config = self._router_adapter.get_non_preflight_request_config(request)
File "/usr/local/lib/python3.7/site-packages/aiohttp_cors/urldispatcher_router_adapter.py", line 315, in get_non_preflight_request_config
request, request.method)
File "/usr/local/lib/python3.7/site-packages/aiohttp_cors/mixin.py", line 23, in get_request_config
raise ValueError("aiohttp-cors is not configured.")
Обработчики сопрограмм
# /api/role.py
from models import Role
from aiohttp.web_response import json_response
class RoleHandler:
def register(self, app):
app.router.add_get('/roles', self.get_roles)
@classmethod
async def get_roles(cls, request):
roles = await Role.select_roles()
return json_response(dict(roles=roles))
Представление на основе класса
# user.py
from aiohttp import web
from aiohttp_cors import CorsViewMixin
from models import User
class UsersCollectionView(web.View, CorsViewMixin):
async def get(self):
users = await User.select_users()
return web.json_response(dict(users=users))
Main
# main.py
from auth_service.api.role import RoleHandler
from auth_service.api.user import UsersCollectionView
def create_app(config, *, loop=None):
loop = loop or asyncio.get_event_loop()
app = Application()
api_v1_app = Application()
# Register all handlers
role_handler = RoleHandler()
role_handler.register(api_v1_app)
api_v1_app.router.add_view('/users', UsersCollectionView)
app.add_subapp('/api/v1', api_v1_app)
app['api_v1'] = api_v1_app
cors = aiohttp_cors.setup(app, defaults={
"*": aiohttp_cors.ResourceOptions(
allow_credentials=True,
expose_headers="*",
allow_methods="*",
allow_headers="*",
max_age=3600
)
})
for route in app.router.routes():
logger.info(f'Adding cors to {route.method} {route.handler}')
cors.add(route)
return app
if __name__ == '__main__':
config = Config.from_environ()
logger.info('Loaded config %r', config)
app = create_app(config)
run_app(app, port=config.server.port)
Что я пробовал :
- Доступ к
/api/v1/roles
(обработчик сопрограмм) работает должным образом - Доступ к любому маршруту API работает должным образом, если я удаляю код настройки CORS
- Настройка cors на
api_v1_app
Экземпляр суб-приложения не решает проблему
Я понятия не имею, как продолжить устранение неполадок.Хотелось бы узнать, является ли это вообще поддерживаемым сценарием для плагина aiohttp-cors
в общем, и если да, то, что я пропускаю.