我有一个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
答案 0 :(得分:1)
flask
方式会破坏人们。
如果您需要整个请求,数据库连接或其他资源 - 明确地将其传递给被调用的函数。
非常明显和优雅的方式,不需要任何隐式的上下文命名空间魔术。
请将threadlocal变量留给系统工具,用户代码不应使用它们以简化和可读性。