mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-18 12:12:19 +03:00
JSONPRenderer with json renderer composition
This commit is contained in:
parent
9516b26a80
commit
34b1bdeef0
|
@ -114,44 +114,26 @@ class JSONRenderer(BaseRenderer):
|
||||||
return json.dumps(obj, cls=DateTimeAwareJSONEncoder, indent=indent, sort_keys=sort_keys)
|
return json.dumps(obj, cls=DateTimeAwareJSONEncoder, indent=indent, sort_keys=sort_keys)
|
||||||
|
|
||||||
|
|
||||||
class JSONPRenderer(BaseRenderer):
|
class JSONPRenderer(JSONRenderer):
|
||||||
"""
|
"""
|
||||||
Renderer which serializes to JSONP
|
Renderer which serializes to JSONP
|
||||||
"""
|
"""
|
||||||
|
|
||||||
media_type = 'application/json-p'
|
media_type = 'application/json-p'
|
||||||
format = 'json-p'
|
format = 'json-p'
|
||||||
|
renderer_class = JSONRenderer
|
||||||
callback_parameter = 'callback'
|
callback_parameter = 'callback'
|
||||||
|
|
||||||
|
def _get_callback(self):
|
||||||
|
return self.view.request.GET.get(self.callback_parameter, self.callback_parameter)
|
||||||
|
|
||||||
|
def _get_renderer(self):
|
||||||
|
return self.renderer_class(self.view)
|
||||||
|
|
||||||
def render(self, obj=None, media_type=None):
|
def render(self, obj=None, media_type=None):
|
||||||
"""
|
callback = self._get_callback()
|
||||||
Renders *obj* into serialized JSONP.
|
json = self._get_renderer().render(obj, media_type)
|
||||||
|
return "%s(%s);" % (callback, json)
|
||||||
The callback function name is taken from the 'callback' parameter
|
|
||||||
contained in the jsonp request.
|
|
||||||
"""
|
|
||||||
callback = self.view.request.GET.get(self.callback_parameter, self.callback_parameter)
|
|
||||||
|
|
||||||
if obj is None:
|
|
||||||
serialized_obj = ''
|
|
||||||
else:
|
|
||||||
json_renderer = self._get_renderer(JSONRenderer.media_type)
|
|
||||||
if json_renderer is None:
|
|
||||||
serialized_obj = json.dumps(obj, cls=DateTimeAwareJSONEncoder)
|
|
||||||
else:
|
|
||||||
serialized_obj = json_renderer.render(obj, JSONRenderer.media_type)
|
|
||||||
|
|
||||||
return "%s(%s);" % (callback, serialized_obj)
|
|
||||||
|
|
||||||
def _get_renderer(self, media_type=None):
|
|
||||||
"""
|
|
||||||
Get first view renderer that serializes *media_type*.
|
|
||||||
"""
|
|
||||||
for r in self.view.renderers:
|
|
||||||
renderer = r(self.view)
|
|
||||||
if renderer.can_handle_response(media_type):
|
|
||||||
return renderer
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
class XMLRenderer(BaseRenderer):
|
class XMLRenderer(BaseRenderer):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user