Как настроить CORS для обработчиков и представлений на основе классов в одном приложении - PullRequest
0 голосов
/ 24 января 2019

Цель : я пытаюсь настроить 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 в общем, и если да, то, что я пропускаю.

...