This is a fork of aio-libs/aiohttp-jinja2 Pull Request 154 which adds support for calling asyncio coroutines from jinja scripts.
This feature is disabled by default, to enable it you must set enable_async=True when calling the setup function. This will set enable_async in the jinja2 Environment.
jinja2 template renderer for aiohttp.web.
Install from PyPI:
pip install aiohttp-jinja2
Install requirement and launch tests:
pip install -r requirements-dev.txt py.test tests
Before template rendering you have to setup jinja2 environment first:
app = web.Application()
aiohttp_jinja2.setup(app,
loader=jinja2.FileSystemLoader('/path/to/templates/folder'))
Import:
import aiohttp_jinja2
import jinja2
Async rendering feature
is enabled by default. You might want to disable that providing enable_async=False
keyword argument to setup
method. There is no difference in usage between two of
them. In async mode enabled if you try to invoke sync Jinja2 methods (e.g. render
)
it will internally invoke corresponding sync method (e.g. render_async
) and run it
as part of the current event loop until the execution finished.
After that you may want to use template engine in your web-handlers. The most convenient way is to decorate a web-handler.
Using the function based web handlers:
@aiohttp_jinja2.template('tmpl.jinja2')
def handler(request):
return {'name': 'Andrew', 'surname': 'Svetlov'}
Or for Class Based Views <https://aiohttp.readthedocs.io/en/stable/web_quickstart.html#class-based-views>:
class Handler(web.View):
@aiohttp_jinja2.template('tmpl.jinja2')
async def get(self):
return {'name': 'Andrew', 'surname': 'Svetlov'}
On handler call the aiohttp_jinja2.template
decorator will pass
returned dictionary {'name': 'Andrew', 'surname': 'Svetlov'}
into
template named tmpl.jinja2
for getting resulting HTML text.
If you need more complex processing (set response headers for example)
you may call render_template
function.
Using a function based web handler:
async def handler(request):
context = {'name': 'Andrew', 'surname': 'Svetlov'}
response = aiohttp_jinja2.render_template('tmpl.jinja2',
request,
context)
response.headers['Content-Language'] = 'ru'
return response
Or, again, a class based view:
class Handler(web.View):
async def get(self):
context = {'name': 'Andrew', 'surname': 'Svetlov'}
response = aiohttp_jinja2.render_template('tmpl.jinja2',
self.request,
context)
response.headers['Content-Language'] = 'ru'
return response
aiohttp_jinja2
is offered under the
Apache 2 license.