Skip to content

Commit

Permalink
Correct request.app context (for handlers not just middlewares) (#2577)
Browse files Browse the repository at this point in the history
* yield _fix_request_current_app middleware uncoditionally; update test; (see #2550)

* Add change notes
  • Loading branch information
popravich authored and asvetlov committed Dec 4, 2017
1 parent a48ae66 commit e47df9a
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 14 deletions.
1 change: 1 addition & 0 deletions CHANGES/2577.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Correct `request.app` context (for handlers not just middlewares).
3 changes: 1 addition & 2 deletions aiohttp/web.py
Original file line number Diff line number Diff line change
Expand Up @@ -295,8 +295,7 @@ def _prepare_middleware(self):
'see #2252'.format(m),
DeprecationWarning, stacklevel=2)
yield m, False
if self._middlewares:
yield _fix_request_current_app(self), True
yield _fix_request_current_app(self), True

@asyncio.coroutine
def _handle(self, request):
Expand Down
38 changes: 26 additions & 12 deletions tests/test_web_functional.py
Original file line number Diff line number Diff line change
Expand Up @@ -1401,35 +1401,49 @@ def on_signal(app):
assert [app, subapp1, subapp2] == order


@pytest.mark.parametrize('route,expected', [
('/sub/', ['app see root', 'subapp see sub']),
('/', ['app see root']),
@pytest.mark.parametrize('route,expected,middlewares', [
('/sub/', ['A: root', 'C: sub', 'D: sub'], 'AC'),
('/', ['A: root', 'B: root'], 'AC'),
('/sub/', ['A: root', 'D: sub'], 'A'),
('/', ['A: root', 'B: root'], 'A'),
('/sub/', ['C: sub', 'D: sub'], 'C'),
('/', ['B: root'], 'C'),
('/sub/', ['D: sub'], ''),
('/', ['B: root'], ''),
])
@asyncio.coroutine
def test_subapp_middleware_context(loop, test_client, route, expected):
def test_subapp_middleware_context(loop, test_client, route, expected,
middlewares):
values = []

def show_app_context(appname):
@web.middleware
@asyncio.coroutine
def middleware(request, handler):
values.append('{} see {}'.format(appname, request.app['my_value']))
values.append('{}: {}'.format(
appname, request.app['my_value']))
return (yield from handler(request))
return middleware

@asyncio.coroutine
def handler(request):
return web.Response(text='Ok')
def make_handler(appname):
@asyncio.coroutine
def handler(request):
values.append('{}: {}'.format(
appname, request.app['my_value']))
return web.Response(text='Ok')
return handler

app = web.Application()
app['my_value'] = 'root'
app.middlewares.append(show_app_context('app'))
app.router.add_get('/', handler)
if 'A' in middlewares:
app.middlewares.append(show_app_context('A'))
app.router.add_get('/', make_handler('B'))

subapp = web.Application()
subapp['my_value'] = 'sub'
subapp.middlewares.append(show_app_context('subapp'))
subapp.router.add_get('/', handler)
if 'C' in middlewares:
subapp.middlewares.append(show_app_context('C'))
subapp.router.add_get('/', make_handler('D'))
app.add_subapp('/sub/', subapp)

client = yield from test_client(app)
Expand Down

0 comments on commit e47df9a

Please sign in to comment.