当它不是处理程序时,如何在 aiohttp 中获取当前请求

how do you get current request's in aiohttp when it isn't a handler

我有一个 aiohttp 应用程序,它有一些使用嵌套应用程序创建的端点。

我的用例是处理请求后,我希望 return 不是 web.response 格式,而是客户端在其请求 header 中请求的任何格式(可能是csv、json、html 等)。

所以我使用了一个装饰器,并从那个装饰器包装器中获取当前请求以了解 header format 并处理对该类型的响应。

我的问题是如何获取当前请求的上下文。我知道烧瓶中没有像 current_app 这样的东西,所以做我想做的最好的事情是什么。

下面我贴出一些解释以上内容的代码:

@subapp_routes.get('')
@subapp_routes.get('/{c_id}')
@format_output
async def index(request):
    print(request)
    c_id = request.match_info.get('c_id', None)
    return await get_index(c_id) 

def format_data_object(data):
    status = 200

    mime = _most_acceptable_format(request, data) # HOW TO PASS THIS CURRENT request AS CURRENTLY THIS ISN'T GETTING RECOGNIZED. I TRIED aiohttp.request and aiohttp.web.request but get not recognized, so not sure now

    if mime == MIME_DATAFRAME:
        return _render_dataframe(data, status)
    elif mime == MIME_CSV:
        return _render_csv(data, status)
    elif mime == MIME_JSON:
        return _render_json(data, status)
    elif mime == MIME_HTML:
        return _render_html(data, status)
    raise InvalidRequest('unrecognized format: "%s"' % mime)


def format_output(function):
    """
    Output format decorator.
    """
    @wraps(function)
    def wrapper(*args, **kwargs):
        try:
            data = function(*args, **kwargs)

            return format_data_object(data)
        except Exception as ex:
            return handle_error(ex)
    return wrapper

flask 惯坏人。

如果您需要整个请求、数据库连接或其他资源——明确地将其传递给被调用的函数。

非常明显和优雅的方式,不需要任何隐式上下文命名空间魔法。

请将诸如线程局部变量之类的东西留给系统工具,为了简单和可读性,用户代码不应使用它们。