Web page templates for the aio asyncio framework
Project description
Web page templates for the aio asyncio framework
Build status
Installation
Requires python >= 3.4 to work
Install with:
pip install aio.web.page
Quick start - hello world web page
Save the following into a file “hello.conf”
[aio]
modules = aio.web.server
[server/my_server]
factory = aio.web.server.factory
port = 8080
[web/my_server]
template_dirs = templates
[web/my_server/my_route]
match = /
route = my_example.route_handler
And save the following into a file named “my_example.py”
import aio.web.page
import aio.web.server
@aio.web.page.template('example_page.html')
def template_handler(request):
return {"message": "Hello template world"}
@aio.web.server.route
def route_handler(request, config):
return (yield from template_handler(request))
And the following into a file named “templates/example_page.html”
<html>
<body>
{{ message }}
</body>
</html>
Run with the aio run command
aio run -c hello.conf
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 >>> import aio.testing >>> import aiohttp
>>> @aio.testing.run_forever(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 matched 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 accordingly
>>> import aio.web.server
>>> @aio.web.server.route ... def route_handler(request, config): ... path = request.match_info['path'] ... ... if path == "path1": ... return (yield from template_handler_1(request)) ... ... elif 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
File details
Details for the file aio.web.page-0.0.6.tar.gz
.
File metadata
- Download URL: aio.web.page-0.0.6.tar.gz
- Upload date:
- Size: 6.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1190c3973bfc1a5e38066aa305e4f3f9c7edfecbbc5a9414ce6a7c649bac33ac |
|
MD5 | d36fb9f5b1571652637b35f3d3d76cd2 |
|
BLAKE2b-256 | 3597334f507aeb202160d1ea2a70aa86a5257e4a316bd8706452af55e2b3a5d9 |