Source code for flask_negotiation.__init__

""":mod:`content_negotiation`
=============================

Provides better content-negotiation for flask.
"""
from flask import Response, request, abort

from renderers import TemplateRenderer
from decorators import provides
from media_type import acceptable_media_types, best_renderer, MediaType

__all__ = ('Render', 'MediaType', 'provides')


[docs]class Render(object): """Dynamic function class renders content. """ def __init__(self, renderers=(TemplateRenderer(), )): super(Render, self).__init__() self.renderers = renderers def __call__(self, data, template=None, status=200, headers=None, renderers=None, ctx=None): """Render `_data` to response. :param data: rendering target. :param template: path for jinja template '.html' can be ommited. :param status: status code for HTTP response. :param headers: additional header informations. :param renderers: list of renderer will be used. :cosnt:`None` to use default renderers :param ctx: context for template renderer. defualt is `{'data':data}` :returns: rendered response :rtype: :class:`flask.Response` You can use it like:: from flask.ext.negotiation import render @app.route('/') def view(): data = get_data() return render(data) Or:: from flask.ext.negotiation import render @app.route('/user/<uid>') def user_view(uid): user = get_user(uid) return render(user, 'user/read') Or:: from flask.ext.negotiation import render from flask.ext.negotiation import provides @app.route('/new_content/') @provides(TemplateRenderer, 'application/json') def content_view(): content = create_content() return render(content, 'content/read.html', 201, ctx={ 'content':content, 'author':content.author, }) """ renderers = renderers or self.renderers media_types = acceptable_media_types(request) renderer, rendered_media_type = best_renderer(renderers, media_types) if renderer is None: abort(406) body = renderer.render(data, template, ctx) return Response(body, status, headers, unicode(rendered_media_type), content_type=unicode(rendered_media_type))