Aiohttp身份验证中间件

5
我希望您能够将中间件附加到特定的处理程序,如果客户端未经授权,则返回错误响应。但是使用以下代码:
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>]]

文档显示我应该返回响应对象,而我也确实这样做了。但还是出现了错误。我哪里出错了?


看起来被调用的 handler 和中间件试图包装的那个没有回复 Web 响应,但这部分不在代码中。我曾经见过类似的双重响应错误,发现问题可能会有些棘手。 - Jacopofar
@h4ck3d.... 你有找到正确的答案吗?能否帮忙回答一下: https://stackoverflow.com/questions/58885706/aiohttp-before-request-for-each-api-call - Anant
1个回答

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

你能帮帮我吗? - Anant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接