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

时间:2018-02-13 22:30:49

标签: request python-3.6 aiohttp

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

我的用例是一旦请求被处理,我想不是以web.response格式返回,而是客户端在请求的标题中请求的格式(可以是csv,json,html等)。

所以我使用装饰器并从装饰器包装器中获取当前请求以了解标头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

1 个答案:

答案 0 :(得分:1)

flask方式会破坏人们。

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

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

请将threadlocal变量留给系统工具,用户代码不应使用它们以简化和​​可读性。