如何缓存所有异步响应以确保它们具有 CORS headers 和 JSON 响应?

How to cache all asyncio responses to make sure they have CORS headers and a JSON response?

我正在尝试使用 aiohttp Server 构建服务。

但是我需要确保所有响应都正确处理 CORS headers 并且所有错误 returns 都是 JSON 响应。

我怎样才能实现这样的事情?

您可能想看看中间件:

http://aiohttp.readthedocs.io/en/stable/web.html#example

这是一个例子:

from aiohttp import web


def setup_middlewares(app):
    error_middleware = error_pages({404: handle_404,
                                    500: handle_500})
    app.middlewares.append(error_middleware)


def error_pages(overrides):
    async def middleware(app, handler):
        async def middleware_handler(request):
            try:
                response = await handler(request)
                override = overrides.get(response.status)
                if override is None:
                    return response
                else:
                    return await override(request, response)
            except web.HTTPException as ex:
                override = overrides.get(ex.status)
                if override is None:
                    return await handle_any(request, ex)
                else:
                    return await override(request, ex)
            except Exception as ex:
                return await handle_500(request, error=ex)
        return middleware_handler
    return middleware


async def handle_any(request, response):
    return web.json_response({
        "status": response.status,
        "message": response.reason
    }, status=response.status)


async def handle_404(request, response):
    return web.json_response({
        "status": 404,
        "message": "Page '{}' not found".format(request.path)
    }, status=404)


async def handle_500(request, response=None, error=None):
    return web.json_response({
            "status": 503,
            "message": "Service currently unavailable"
        }, status=503)

关于 CORS 支持——使用 aiohttp-cors。 自述文件包含所有必需的设置和使用说明。