diff options
Diffstat (limited to 'rest_framework/renderers.py')
| -rw-r--r-- | rest_framework/renderers.py | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 2b56d6e4..b4fa55bd 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -9,7 +9,6 @@ REST framework also provides an HTML renderer the renders the browsable API. from __future__ import unicode_literals import copy -import string import json from django import forms from django.http.multipartparser import parse_header @@ -36,6 +35,7 @@ class BaseRenderer(object): media_type = None format = None + charset = 'utf-8' def render(self, data, accepted_media_type=None, renderer_context=None): raise NotImplemented('Renderer class requires .render() to be implemented') @@ -49,6 +49,8 @@ class JSONRenderer(BaseRenderer): media_type = 'application/json' format = 'json' encoder_class = encoders.JSONEncoder + ensure_ascii = True + charset = 'iso-8859-1' def render(self, data, accepted_media_type=None, renderer_context=None): """ @@ -72,7 +74,17 @@ class JSONRenderer(BaseRenderer): except (ValueError, TypeError): indent = None - return json.dumps(data, cls=self.encoder_class, indent=indent) + ret = json.dumps(data, cls=self.encoder_class, + indent=indent, ensure_ascii=self.ensure_ascii) + + if not self.ensure_ascii: + return bytes(ret.encode(self.charset)) + return ret + + +class UnicodeJSONRenderer(JSONRenderer): + ensure_ascii = False + charset = 'utf-8' class JSONPRenderer(JSONRenderer): @@ -115,6 +127,7 @@ class XMLRenderer(BaseRenderer): media_type = 'application/xml' format = 'xml' + charset = 'utf-8' def render(self, data, accepted_media_type=None, renderer_context=None): """ @@ -164,6 +177,7 @@ class YAMLRenderer(BaseRenderer): media_type = 'application/yaml' format = 'yaml' encoder = encoders.SafeDumper + charset = 'utf-8' def render(self, data, accepted_media_type=None, renderer_context=None): """ @@ -204,6 +218,7 @@ class TemplateHTMLRenderer(BaseRenderer): '%(status_code)s.html', 'api_exception.html' ] + charset = 'utf-8' def render(self, data, accepted_media_type=None, renderer_context=None): """ @@ -275,6 +290,7 @@ class StaticHTMLRenderer(TemplateHTMLRenderer): """ media_type = 'text/html' format = 'html' + charset = 'utf-8' def render(self, data, accepted_media_type=None, renderer_context=None): renderer_context = renderer_context or {} @@ -296,6 +312,7 @@ class BrowsableAPIRenderer(BaseRenderer): media_type = 'text/html' format = 'api' template = 'rest_framework/api.html' + charset = 'utf-8' def get_default_renderer(self, view): """ @@ -320,8 +337,8 @@ class BrowsableAPIRenderer(BaseRenderer): renderer_context['indent'] = 4 content = renderer.render(data, accepted_media_type, renderer_context) - if not all(char in string.printable for char in content): - return '[%d bytes of binary content]' + if renderer.charset is None: + return '[%d bytes of binary content]' % len(content) return content @@ -337,6 +354,8 @@ class BrowsableAPIRenderer(BaseRenderer): try: view.check_permissions(request) + if obj is not None: + view.check_object_permissions(request, obj) except exceptions.APIException: return False # Doesn't have permissions return True |
