我想将中间件附加到特定的处理程序,并且如果未授权客户端,则想返回错误响应。但是,使用以下代码:

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


我收到一个例外:

AssertionError: Handler <function AbstractRoute.__init__.
<locals>.handler_wrapper at 0x10da56bf8> should return response
instance, got <class 'NoneType'> [middlewares [<function
middleware_factory at 0x1104cb268>]]


文档指出,我应该返回正在执行的响应对象。还是这个错误。我要去哪里错了?

最佳答案

您可以查看an example from official documentation

但是,如果要拥有中间件工厂,主要要考虑的是-需要一个功能而不是协程。另外,建议为此使用@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

关于python - Aiohttp认证中间件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41737468/

10-15 19:14