From 3ab8ae256caf8d548dd6346f57a63825963c6d09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Jes=C3=BAs=20Garc=C3=ADa=20de=20Soria?= Date: Sat, 17 Mar 2018 22:57:15 +0000 Subject: [PATCH 1/2] Allow context_processors to compose from parent apps. Fixes #193. --- aiohttp_jinja2/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aiohttp_jinja2/__init__.py b/aiohttp_jinja2/__init__.py index 680643b4..413ef3fe 100644 --- a/aiohttp_jinja2/__init__.py +++ b/aiohttp_jinja2/__init__.py @@ -109,7 +109,8 @@ async def wrapped(*args): @web.middleware async def context_processors_middleware(request, handler): - request[REQUEST_CONTEXT_KEY] = {} + if REQUEST_CONTEXT_KEY not in request: + request[REQUEST_CONTEXT_KEY] = {} for processor in request.app[APP_CONTEXT_PROCESSORS_KEY]: request[REQUEST_CONTEXT_KEY].update(await processor(request)) return await handler(request) From 346e55f2829d30f035af84524157d3ccf244f52b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Jes=C3=BAs=20Garc=C3=ADa=20de=20Soria?= Date: Sun, 18 Mar 2018 23:43:56 +0000 Subject: [PATCH 2/2] Add tests for context processors in nested apps. The new test completes coverage and checks that subapps nested within other apps can have additive context processors. --- tests/test_context_processors.py | 46 ++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/tests/test_context_processors.py b/tests/test_context_processors.py index d9d677c1..abbe3415 100644 --- a/tests/test_context_processors.py +++ b/tests/test_context_processors.py @@ -35,6 +35,52 @@ async def processor(request): assert 'foo: 1, bar: 2, path: /' == txt +async def test_nested_context_processors(aiohttp_client): + + @aiohttp_jinja2.template('tmpl.jinja2') + async def func(request): + return {'bar': 2} + + subapp = web.Application(middlewares=[ + aiohttp_jinja2.context_processors_middleware]) + aiohttp_jinja2.setup(subapp, loader=jinja2.DictLoader( + {'tmpl.jinja2': + 'foo: {{ foo }}, bar: {{ bar }}, baz: {{ baz }}, path: {{ request.path }}'})) + + async def subprocessor(request): + return {'foo': 1, + 'bar': 'should be overwriten'} + + subapp['aiohttp_jinja2_context_processors'] = ( + aiohttp_jinja2.request_processor, + subprocessor, + ) + + subapp.router.add_get('/', func) + + app = web.Application(middlewares=[ + aiohttp_jinja2.context_processors_middleware]) + aiohttp_jinja2.setup(app, loader=jinja2.DictLoader({})) + + async def processor(request): + return {'baz': 5} + + app['aiohttp_jinja2_context_processors'] = ( + aiohttp_jinja2.request_processor, + processor, + ) + + app.add_subapp('/sub/', subapp) + + + client = await aiohttp_client(app) + + resp = await client.get('/sub/') + assert 200 == resp.status + txt = await resp.text() + assert 'foo: 1, bar: 2, baz: 5, path: /sub/' == txt + + async def test_context_is_response(aiohttp_client): @aiohttp_jinja2.template('tmpl.jinja2')