Aiohttp认证中间件

时间:2017-01-19 08:52:13

标签: 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

我得到一个例外:

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

文档说明我应该返回一个我正在做的响应对象。仍然是这个错误。我哪里错了?

1 个答案:

答案 0 :(得分:0)

您可以查看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