Skip to main content

Web page templates for the aio asyncio framework

Project description

Web server for the aio asyncio framework

Build status

https://travis-ci.org/phlax/aio.web.page.svg?branch=master

Installation

Install with:

pip install aio.web.page

aio.web.page usage

aio.web.page provides templates and fragments for building web pages

Lets set up a test to run a server and request a web page

>>> from aio.app.runner import runner
>>> from aio.testing import aiofuturetest
>>> import aiohttp
>>> @aiofuturetest(sleep=1)
... def run_web_server(config, request_page="http://localhost:7070"):
...     yield from runner(['run'], config_string=config)
...
...     def call_web_server():
...         result = yield from (
...             yield from aiohttp.request(
...                "GET", request_page)).read()
...         aio.web.server.clear()
...
...         print(result.decode())
...
...     return call_web_server

Templates

An @aio.web.server.route handler can defer to other templates, for example according to the path.

>>> example_config = """
... [aio]
... log_level = ERROR
... modules = aio.web.server
...        aio.web.server.tests
...
... [server/server_name]
... factory: aio.web.server.factory
... port: 7070
...
... [web/server_name/route_name]
... match = /{path:.*}
... route = aio.web.page.tests._example_route_handler
... """

Lets create a couple of template handlers

>>> import aio.web.page
>>> @aio.web.page.template("test_template.html")
... def template_handler_1(request):
...     return {
...         'message': "Hello, world from template handler 1"}

Template handlers dont have to specify a template, but they must return a response object if they dont

>>> @aio.web.page.template
... def template_handler_2(request):
...     return aiohttp.web.Response(
...         body=b"Hello, world from template handler 2")

And lets set up a route handler which will defer to a template according to the route

>>> import aio.web.server
>>> @aio.web.server.route
... def route_handler(request, config):
...
...     if request.path == "/path1":
...         return (yield from template_handler_1(request))
...
...     elif request.path == "/path2":
...         return (yield from template_handler_2(request))
...
...     raise aiohttp.web.HTTPNotFound

And make it importable

>>> import aio.web.page.tests
>>> aio.web.page.tests._example_route_handler = route_handler

Calling the server at /path1 we get the templated handler

>>> run_web_server(
...     example_config,
...     request_page="http://localhost:7070/path1")
<html>
  <body>
    Hello, world from template handler 1
  </body>
</html>

And calling on /path2 we get the response from the handler without a template

>>> run_web_server(
...     example_config,
...     request_page="http://localhost:7070/path2")
Hello, world from template handler 2

Fragments

Fragments render a snippet of html for embedding in other templates.

Fragments must always specify a template

>>> @aio.web.page.fragment("fragments/test_fragment.html")
... def fragment_handler(request, test_list):
...     return {'test_list': test_list}

And fragment handlers should always return a context dictionary.

Both templates and fragments can take arbitrary arguments

>>> @aio.web.page.template("test_template.html")
... def template_handler(request, test_list):
...     return {'message': (yield from fragment_handler(request, test_list))}

Whereas a route always receives (request, config)

>>> @aio.web.server.route
... def route_handler(request, config):
...
...     return (yield from template_handler(request, ["foo", "bar", "baz"]))
>>> aio.web.page.tests._example_route_handler = route_handler
>>> run_web_server(
...     example_config,
...     request_page="http://localhost:7070/")
<html>
  <body>
    <ul>
      <li>foo</li><li>bar</li><li>baz</li>
    </ul>
  </body>
</html>

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aio.web.page-0.0.1.tar.gz (4.5 kB view details)

Uploaded Source

File details

Details for the file aio.web.page-0.0.1.tar.gz.

File metadata

File hashes

Hashes for aio.web.page-0.0.1.tar.gz
Algorithm Hash digest
SHA256 9ebab8a1d9013ec29b41fcccc5b0c64844c14b1d96f168624d0c15eb5d71cb11
MD5 6a39237648d0dc2451a7ca5f9d37fe89
BLAKE2b-256 39477bf02a569e0946cb8c441931fbb0a4b8ce6361d0f1217ff103449c59649c

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page