我想将中间件附加到特定处理程序,如果客户端未经授权,则希望返回错误响应。但是使用以下代码:
async def middleware_factory(app, handler):
async def auth_handler(request):
if request.headers.get('Authorization') == 'Basic test1234':
return await handler(request)
return web.Response(text='Forbidden', status='403')
return auth_handler
Run Code Online (Sandbox Code Playgroud)
我收到一个异常:
AssertionError: Handler <function AbstractRoute.__init__.
<locals>.handler_wrapper at 0x10da56bf8> should return response
instance, got <class 'NoneType'> [middlewares [<function
middleware_factory at 0x1104cb268>]]
Run Code Online (Sandbox Code Playgroud)
文档指出我应该返回我正在执行的响应对象。还是这个错误。我哪里错了?
您可以查看官方文档中的示例。
但主要关心的是,如果你想要中间件工厂 - 需要是一个函数而不是协程。另外,建议使用@web.middleware装饰器。
from aiohttp import web
def middleware_factory(text):
@web.middleware
async def sample_middleware(request, handler):
resp = await handler(request)
resp.text = resp.text + text
return resp
return sample_middleware
Run Code Online (Sandbox Code Playgroud)