mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-11-04 01:47:59 +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