mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-12-02 14:34:04 +03:00
Merge pull request #1750 from tomchristie/json-renderer-refactor
Refactor JSONRenderer slightly for easier overriding
This commit is contained in:
commit
9b16f1bf1d
|
@ -54,32 +54,37 @@ class JSONRenderer(BaseRenderer):
|
||||||
format = 'json'
|
format = 'json'
|
||||||
encoder_class = encoders.JSONEncoder
|
encoder_class = encoders.JSONEncoder
|
||||||
ensure_ascii = True
|
ensure_ascii = True
|
||||||
charset = None
|
|
||||||
# JSON is a binary encoding, that can be encoded as utf-8, utf-16 or utf-32.
|
# We don't set a charset because JSON is a binary encoding,
|
||||||
|
# that can be encoded as utf-8, utf-16 or utf-32.
|
||||||
# See: http://www.ietf.org/rfc/rfc4627.txt
|
# See: http://www.ietf.org/rfc/rfc4627.txt
|
||||||
# Also: http://lucumr.pocoo.org/2013/7/19/application-mimetypes-and-encodings/
|
# Also: http://lucumr.pocoo.org/2013/7/19/application-mimetypes-and-encodings/
|
||||||
|
charset = None
|
||||||
|
|
||||||
def render(self, data, accepted_media_type=None, renderer_context=None):
|
def get_indent(self, accepted_media_type, renderer_context):
|
||||||
"""
|
|
||||||
Render `data` into JSON.
|
|
||||||
"""
|
|
||||||
if data is None:
|
|
||||||
return bytes()
|
|
||||||
|
|
||||||
# If 'indent' is provided in the context, then pretty print the result.
|
|
||||||
# E.g. If we're being called by the BrowsableAPIRenderer.
|
|
||||||
renderer_context = renderer_context or {}
|
|
||||||
indent = renderer_context.get('indent', None)
|
|
||||||
|
|
||||||
if accepted_media_type:
|
if accepted_media_type:
|
||||||
# If the media type looks like 'application/json; indent=4',
|
# If the media type looks like 'application/json; indent=4',
|
||||||
# then pretty print the result.
|
# then pretty print the result.
|
||||||
base_media_type, params = parse_header(accepted_media_type.encode('ascii'))
|
base_media_type, params = parse_header(accepted_media_type.encode('ascii'))
|
||||||
indent = params.get('indent', indent)
|
|
||||||
try:
|
try:
|
||||||
indent = max(min(int(indent), 8), 0)
|
return max(min(int(params['indent']), 8), 0)
|
||||||
except (ValueError, TypeError):
|
except (KeyError, ValueError, TypeError):
|
||||||
indent = None
|
pass
|
||||||
|
|
||||||
|
# If 'indent' is provided in the context, then pretty print the result.
|
||||||
|
# E.g. If we're being called by the BrowsableAPIRenderer.
|
||||||
|
return renderer_context.get('indent', None)
|
||||||
|
|
||||||
|
|
||||||
|
def render(self, data, accepted_media_type=None, renderer_context=None):
|
||||||
|
"""
|
||||||
|
Render `data` into JSON, returning a bytestring.
|
||||||
|
"""
|
||||||
|
if data is None:
|
||||||
|
return bytes()
|
||||||
|
|
||||||
|
renderer_context = renderer_context or {}
|
||||||
|
indent = self.get_indent(accepted_media_type, renderer_context)
|
||||||
|
|
||||||
ret = json.dumps(data, cls=self.encoder_class,
|
ret = json.dumps(data, cls=self.encoder_class,
|
||||||
indent=indent, ensure_ascii=self.ensure_ascii)
|
indent=indent, ensure_ascii=self.ensure_ascii)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user