Viewing file: helpers.py (2.33 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
""" useful context functions, see http://jinja.pocoo.org/docs/dev/api/#jinja2.contextfunction """ import sys from typing import Any, Dict, Optional, Union
import jinja2 from aiohttp import web from yarl import URL
if sys.version_info >= (3, 8): from typing import TypedDict
class _Context(TypedDict, total=False): app: web.Application
else: _Context = Dict[str, Any]
@jinja2.pass_context def url_for( context: _Context, __route_name: str, query_: Optional[Dict[str, str]] = None, **parts: Union[str, int] ) -> URL: """Filter for generating urls.
Usage: {{ url('the-view-name') }} might become "/path/to/view" or {{ url('item-details', id=123, query_={'active': 'true'}) }} might become "/items/1?active=true". """ app = context["app"]
parts_clean: Dict[str, str] = {} for key in parts: val = parts[key] if isinstance(val, str): # if type is inherited from str expilict cast to str makes sense # if type is exactly str the operation is very fast val = str(val) elif type(val) is int: # int inherited classes like bool are forbidden val = str(val) else: raise TypeError( "argument value should be str or int, " "got {} -> [{}] {!r}".format(key, type(val), val) ) parts_clean[key] = val
url = app.router[__route_name].url_for(**parts_clean) if query_: url = url.with_query(query_) return url
@jinja2.pass_context def static_url(context: _Context, static_file_path: str) -> str: """Filter for generating urls for static files.
NOTE: you'll need to set app['static_root_url'] to be used as the root for the urls returned.
Usage: {{ static('styles.css') }} might become "/static/styles.css" or "http://mycdn.example.com/styles.css" """ app = context["app"] try: static_url = app["static_root_url"] except KeyError: raise RuntimeError( "app does not define a static root url " "'static_root_url', you need to set the url root " "with app['static_root_url'] = '<static root>'." ) from None return "{}/{}".format(static_url.rstrip("/"), static_file_path.lstrip("/"))
GLOBAL_HELPERS = dict( url=url_for, static=static_url, )
|