Skip to content

Latest commit

 

History

History
215 lines (140 loc) · 6 KB

index.rst

File metadata and controls

215 lines (140 loc) · 6 KB

aiohttp_mako

mako template renderer for aiohttp.web. aiohttp_mako based on :term:`aiohttp_jinja2`. Library has almost same api and it is used in aiohttp_debugtoolbar.

Usage

Before template rendering you have to setup mako templates location first:

app = web.Application(loop=loop)
lookup = aiohttp_mako.setup(app, input_encoding='utf-8',
                            output_encoding='utf-8',
                            default_filters=['decode.utf8'])

After that you may to use template engine in your web-handlers. The most convinient way is to decorate web-handler:

@aiohttp_mako.template('tmpl.html')
async def handler(request):
    return {'head': 'aiohttp_mako', 'text': 'Hello World!'}

On handler call the aiohttp_mako.template decorator will pass returned dictionary {'head': 'aiohttp_mako', 'text': 'Hello World!'} into template named "tmpl.html" for getting resulting HTML text.

If you need more complex processing (set response headers for example) you may call render_template function:

async def handler(request):
    context = {'head': 'aiohttp_mako', 'text': 'Hello World!'}
    response = aiohttp_mako.render_template('tmpl.html',
                                              request,
                                              context)
    response.headers['Content-Language'] = 'ru'
    return response

Context processors

Context processors is a way to add some variables to each template context. It calculates variables on each request.

Context processors is following last-win strategy. Therefore a context processor could rewrite variables delivered with previous one.

In order to use context processors create required processors:

async def foo_processor(request):
    return {'foo': 'bar'}

And pass them into :func:`setup`:

aiohttp_mako.setup(
    app,
    context_processors=[foo_processor,
                        aiohttp_mako.request_processor],
    loader=loader)

As you can see, there is a built-in :func:`request_processor`, which adds current :class:`aiohttp.web.Request` into context of templates under 'request' name.

Example

import asyncio
import aiohttp_mako
from aiohttp import web


@aiohttp_mako.template('index.html')
def func(request):
    return {'head': 'aiohttp_mako', 'text': 'Hello World!'}


async def init(loop):
    app = web.Application(loop=loop)
    lookup = aiohttp_mako.setup(app, input_encoding='utf-8',
                                output_encoding='utf-8',
                                default_filters=['decode.utf8'])
    template = """<html><body><h1>${head}</h1>${text}</body></html>"""
    lookup.put_string('index.html', template)
    app.router.add_route('GET', '/', func)

    handler = app.make_handler()
    srv = await loop.create_server(handler, '127.0.0.1', 8080)
    print("Server started at https://127.0.0.1:8080")
    return srv, handler


loop = asyncio.get_event_loop()
srv, handler = loop.run_until_complete(init(loop))
try:
    loop.run_forever()
except KeyboardInterrupt:
    loop.run_until_complete(handler.finish_connections())

Reference

.. module:: aiohttp_mako
.. currentmodule:: aiohttp_mako
.. data:: APP_KEY

   The key name in :class:`aiohttp.web.Application` dictionary,
   ``'aiohttp_mako_environment'`` for storing :term:`mako`
   template lookup object (:class:`mako.lookup.TemplateLookup`).

   Usually you don't need to operate with *application* manually, left
   it to :mod:`aiohttp_mako` functions.
.. function:: get_lookup(app, app_key=APP_KEY)

   Get from `aiohttp` application instance :class:`mako.lookup.TemplateLookup`
   object

   :param app: (:class:`aiohttp.web.Application` instance).
   :param app_key: is an optional key for application dict, :const:`APP_KEY`
        by default.

   :returns: :class:`mako.lookup.TemplateLookup` object which has stored in the
        :class:`aiohttp.web.Application`
.. function:: render_template(template_name, request, context, *, \
                              app_key=APP_KEY)

    Return :class:`aiohttp.web.Response` which contains template
    *template_name* filled with *context*.

    :param template_name: name of template plus relative path.
    :param request: :class:`aiohttp.web.Request` object
    :param context: dictionary object required to render current template
    :param app_key: is an optional key for application dict, :const:`APP_KEY`
        by default.

.. function:: setup(app, *args, app_key=APP_KEY, **kwargs)

   Return :class:`mako.lookup.TemplateLookup` instance, which contains
   collections of templates.

   :param app: (:class:`aiohttp.web.Application` instance).
   :param app_key: is an optional key for application dict, :const:`APP_KEY`
   by default.

License

aiohttp_mako is offered under the Apache 2 license.

Glossary

.. glossary::

   aiohttp_jinja2

       `jinja2` template renderer for `aiohttp.web`.

       See https://github.com/aio-libs/aiohttp_jinja2/

   jinja2

       A modern and designer-friendly templating language for Python.

       See http://jinja.pocoo.org/

   mako

       Mako is a template library written in Python. It provides a familiar,
       non-XML syntax which compiles into Python modules for maximum
       performance.

       See http://www.makotemplates.org/

Indices and tables