h4ck3d
h4ck3d

Reputation: 6364

Aiohttp authentication middleware

I want to attach a middleware to specific handler and if client is not authorized then want to return an error response. However with the following code :

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

I am getting an exception that :

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

Documentation states that I should return a response object which I am doing. Still this error. Where am I going wrong?

Upvotes: 5

Views: 5185

Answers (1)

wowkin2
wowkin2

Reputation: 6355

You can look to an example from official documentation.

But the main concern that if you want to have Middleware Factory - needs to be a function not a coroutine. Also, recommend to use @web.middleware decorator for that.

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

Upvotes: 2

Related Questions