User:Babbage Linden/Django/Content Negotiation
Jump to navigation
Jump to search
Content negotiation was also very simple to add based on a blog post.
formatters = {'application/llsd+binary': llsd.format_binary, 'application/llsd+notation': llsd.format_notation, 'application/llsd+xml': llsd.format_xml, 'application/xml': llsd.format_xml} parsers = {'application/llsd+binary': llsd.parse_binary, 'application/llsd+notation': llsd.parse_notation, 'application/llsd+xml': llsd.parse_xml, 'application/xml': llsd.parse_xml} def negotiate_content(func): def wrapper(request, *args, **kwargs): if request.raw_post_data: request_type = request.META.get('CONTENT_TYPE', 'application/xml') parser = parsers.get(request_type, llsd.parse_xml) request.data = parser(request.raw_post_data) response_data = func(request, *args, **kwargs) response_type = request.META.get('HTTP_ACCEPT', 'application/xml') formatter = formatters.get(response_type, llsd.format_xml) return HttpResponse(formatter(response_data)) return wrapper
Which allows handlers to be decorated like this:
@negotiate_content def region_GET(request, region_id): #...