Aiohttp认证中间件

h4c*_*k3d 5 python aiohttp

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

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)

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

wow*_*in2 2

您可以查看官方文档中的示例

但主要关心的是,如果你想要中间件工厂 - 需要是一个函数而不是协程。另外,建议使用@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)