aiohttp中是否有像烧瓶中那样的请求后方法
Is there an after request method in aiohttp like in flask
Flask 提供了这个不错的 @app.after_request
装饰器,它允许在处理完 http 请求后执行一个方法。请参阅文档 here。
您如何使用 aiohttp 实现类似的模式?
通常在处理完请求后发送日志。
aiohttp
网络服务器支持 signals,它们是在特定点调用的挂钩。
Application.on_response_prepare
signal 相当于 Flask 的 after_request
处理程序。在准备返回给客户端时使用它来修改响应:
async def on_prepare(request, response):
response.headers['My-Header'] = 'value'
app.on_response_prepare.append(on_prepare)
信号同时接收request
和response
对象。如果你想实现 Flask pattern for registering a callback per request, and are using Python 3.7, you can use a contextvars
context variable:
from contextvars import ContextVar
from typing import Iterable, Callable
from aiohttp import web
PrepareCallback = Callable[[web.Request, web.StreamResponse], None]
call_on_prepare: ContextVar[Iterable[PrepareCallback]] = ContextVar('call_on_prepare', ())
async def per_request_callbacks(request, response):
# executed sequentially, in order of registration!
for callback in call_on_prepare.get():
await callback(request, response)
app.on_response_prepare.append(per_request_callbacks)
def response_prepare_after_this_request(awaitable):
call_on_prepare.set(call_on_prepare.get() + (awaitable,))
return awaitable
然后在请求中像这样使用它:
def invalidate_username_cache():
@response_prepare_after_this_request
async def delete_username_cookie(request, response):
response.del_cookie('username')
return response
如果您需要支持 Python 版本 < 3.7,则必须将回调列表存储在 app
、request
或 response
对象上;请参阅 aiohttp
常见问题解答的 data sharing section。就个人而言,我认为 contextvars 在这里是更好的模式,因为它为 response_prepare_after_this_request
等实用程序提供了更好的封装,现在可以单独分发而不用担心与 aiohttp.web
对象映射中的其他数据集发生冲突。
Flask 提供了这个不错的 @app.after_request
装饰器,它允许在处理完 http 请求后执行一个方法。请参阅文档 here。
您如何使用 aiohttp 实现类似的模式? 通常在处理完请求后发送日志。
aiohttp
网络服务器支持 signals,它们是在特定点调用的挂钩。
Application.on_response_prepare
signal 相当于 Flask 的 after_request
处理程序。在准备返回给客户端时使用它来修改响应:
async def on_prepare(request, response):
response.headers['My-Header'] = 'value'
app.on_response_prepare.append(on_prepare)
信号同时接收request
和response
对象。如果你想实现 Flask pattern for registering a callback per request, and are using Python 3.7, you can use a contextvars
context variable:
from contextvars import ContextVar
from typing import Iterable, Callable
from aiohttp import web
PrepareCallback = Callable[[web.Request, web.StreamResponse], None]
call_on_prepare: ContextVar[Iterable[PrepareCallback]] = ContextVar('call_on_prepare', ())
async def per_request_callbacks(request, response):
# executed sequentially, in order of registration!
for callback in call_on_prepare.get():
await callback(request, response)
app.on_response_prepare.append(per_request_callbacks)
def response_prepare_after_this_request(awaitable):
call_on_prepare.set(call_on_prepare.get() + (awaitable,))
return awaitable
然后在请求中像这样使用它:
def invalidate_username_cache():
@response_prepare_after_this_request
async def delete_username_cookie(request, response):
response.del_cookie('username')
return response
如果您需要支持 Python 版本 < 3.7,则必须将回调列表存储在 app
、request
或 response
对象上;请参阅 aiohttp
常见问题解答的 data sharing section。就个人而言,我认为 contextvars 在这里是更好的模式,因为它为 response_prepare_after_this_request
等实用程序提供了更好的封装,现在可以单独分发而不用担心与 aiohttp.web
对象映射中的其他数据集发生冲突。