Source code for ramverk.rendering
try:
import simplejson as json
except ImportError:
import json
from werkzeug.utils import cached_property
[docs]class RenderingMixin(object):
"""Generic mixins for adding support for "renderers" to an
application."""
@cached_property
[docs] def renderers(self):
"""Mapping of renderer names to rendering callables. A name is
either a plain string like ``'json'`` or starts with a dot to
represent a file extension, e.g. ``'.html'``."""
return {}
[docs] def render(self, renderer_name, **context):
"""Look up a renderer and call it with the name and context. The
name is cut at the first dot such that ``'index.html'`` gets the
``'.html'`` renderer."""
if '.' in renderer_name:
renderer = renderer_name[renderer_name.index('.'):]
else:
renderer = renderer_name
renderer = self.renderers[renderer]
return renderer(renderer_name, **context)
[docs]class TemplatingMixin(RenderingMixin):
"""Add common functionality for templating to an application."""
[docs] def create_template_context(self, overrides):
"""Create a context mapping to render a template
in, including `overrides`. Override to add globals. Includes
`request`, `url` and `path` from the application, and the
application as `app`, by default."""
context = dict(app=self,
request=self.request,
url=self.url,
path=self.path)
context.update(overrides)
return context
[docs]class JSONRenderingMixin(RenderingMixin):
"""Add a `json` renderer to an application."""
@cached_property
def renderers(self):
renderers = super(JSONRenderingMixin, self).renderers
renderers['json'] = self.__render
return renderers
def __default(self, obj):
raise TypeError
def __render(self, _, **kwargs):
return self.response(json.dumps(kwargs, default=self.__default))\
.using(mimetype='application/json')