mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-06-07 15:13:15 +03:00
Support generators
This commit is contained in:
parent
ebbaff0853
commit
a25b4be441
|
@ -6,12 +6,12 @@ by serializing the output along with documentation regarding the View, output st
|
||||||
and providing forms and links depending on the allowed methods, renderers and parsers on the View.
|
and providing forms and links depending on the allowed methods, renderers and parsers on the View.
|
||||||
"""
|
"""
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.core.serializers.json import DateTimeAwareJSONEncoder
|
|
||||||
from django.template import RequestContext, loader
|
from django.template import RequestContext, loader
|
||||||
from django.utils import simplejson as json
|
from django.utils import simplejson as json
|
||||||
|
|
||||||
from djangorestframework.compat import yaml
|
from djangorestframework.compat import yaml
|
||||||
from djangorestframework.utils import dict2xml
|
from djangorestframework.utils import dict2xml
|
||||||
|
from djangorestframework.utils import encoders
|
||||||
from djangorestframework.utils.breadcrumbs import get_breadcrumbs
|
from djangorestframework.utils.breadcrumbs import get_breadcrumbs
|
||||||
from djangorestframework.utils.mediatypes import get_media_type_params, add_media_type_param, media_type_matches
|
from djangorestframework.utils.mediatypes import get_media_type_params, add_media_type_param, media_type_matches
|
||||||
from djangorestframework import VERSION
|
from djangorestframework import VERSION
|
||||||
|
@ -94,6 +94,7 @@ class JSONRenderer(BaseRenderer):
|
||||||
|
|
||||||
media_type = 'application/json'
|
media_type = 'application/json'
|
||||||
format = 'json'
|
format = 'json'
|
||||||
|
encoder_class = encoders.JSONEncoder
|
||||||
|
|
||||||
def render(self, obj=None, media_type=None):
|
def render(self, obj=None, media_type=None):
|
||||||
"""
|
"""
|
||||||
|
@ -112,7 +113,7 @@ class JSONRenderer(BaseRenderer):
|
||||||
except (ValueError, TypeError):
|
except (ValueError, TypeError):
|
||||||
indent = None
|
indent = None
|
||||||
|
|
||||||
return json.dumps(obj, cls=DateTimeAwareJSONEncoder, indent=indent, sort_keys=sort_keys)
|
return json.dumps(obj, cls=self.encoder_class, indent=indent, sort_keys=sort_keys)
|
||||||
|
|
||||||
|
|
||||||
class JSONPRenderer(JSONRenderer):
|
class JSONPRenderer(JSONRenderer):
|
||||||
|
|
|
@ -22,6 +22,18 @@ RENDERER_A_SERIALIZER = lambda x: 'Renderer A: %s' % x
|
||||||
RENDERER_B_SERIALIZER = lambda x: 'Renderer B: %s' % x
|
RENDERER_B_SERIALIZER = lambda x: 'Renderer B: %s' % x
|
||||||
|
|
||||||
|
|
||||||
|
expected_results = [
|
||||||
|
((elem for elem in [1, 2, 3]), JSONRenderer, '[1, 2, 3]') # Generator
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class BasicRendererTests(TestCase):
|
||||||
|
def test_expected_results(self):
|
||||||
|
for value, renderer_cls, expected in expected_results:
|
||||||
|
output = renderer_cls().render(value)
|
||||||
|
self.assertEquals(output, expected)
|
||||||
|
|
||||||
|
|
||||||
class RendererA(BaseRenderer):
|
class RendererA(BaseRenderer):
|
||||||
media_type = 'mock/renderera'
|
media_type = 'mock/renderera'
|
||||||
format = "formata"
|
format = "formata"
|
||||||
|
@ -286,7 +298,7 @@ if YAMLRenderer:
|
||||||
obj = {'foo': ['bar', 'baz']}
|
obj = {'foo': ['bar', 'baz']}
|
||||||
|
|
||||||
renderer = YAMLRenderer(None)
|
renderer = YAMLRenderer(None)
|
||||||
parser = YAMLParser(None)
|
parser = YAMLParser()
|
||||||
|
|
||||||
content = renderer.render(obj, 'application/yaml')
|
content = renderer.render(obj, 'application/yaml')
|
||||||
(data, files) = parser.parse(StringIO(content))
|
(data, files) = parser.parse(StringIO(content))
|
||||||
|
|
33
djangorestframework/utils/encoders.py
Normal file
33
djangorestframework/utils/encoders.py
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
import datetime
|
||||||
|
import decimal
|
||||||
|
from django.utils import timezone
|
||||||
|
from django.utils import simplejson as json
|
||||||
|
|
||||||
|
|
||||||
|
class JSONEncoder(json.JSONEncoder):
|
||||||
|
"""
|
||||||
|
JSONEncoder subclass that knows how to encode date/time and decimal types.
|
||||||
|
"""
|
||||||
|
def default(self, o):
|
||||||
|
# See "Date Time String Format" in the ECMA-262 specification.
|
||||||
|
if isinstance(o, datetime.datetime):
|
||||||
|
r = o.isoformat()
|
||||||
|
if o.microsecond:
|
||||||
|
r = r[:23] + r[26:]
|
||||||
|
if r.endswith('+00:00'):
|
||||||
|
r = r[:-6] + 'Z'
|
||||||
|
return r
|
||||||
|
elif isinstance(o, datetime.date):
|
||||||
|
return o.isoformat()
|
||||||
|
elif isinstance(o, datetime.time):
|
||||||
|
if timezone.is_aware(o):
|
||||||
|
raise ValueError("JSON can't represent timezone-aware times.")
|
||||||
|
r = o.isoformat()
|
||||||
|
if o.microsecond:
|
||||||
|
r = r[:12]
|
||||||
|
return r
|
||||||
|
elif isinstance(o, decimal.Decimal):
|
||||||
|
return str(o)
|
||||||
|
elif hasattr(o, '__iter__'):
|
||||||
|
return [i for i in o]
|
||||||
|
return super(JSONEncoder, self).default(o)
|
|
@ -17,7 +17,7 @@ Now that we're inside a virtualenv environment, we can install our package requi
|
||||||
pip install django
|
pip install django
|
||||||
pip install djangorestframework
|
pip install djangorestframework
|
||||||
|
|
||||||
***Note:** To exit the virtualenv environment at any time, just type `deactivate`. For more information see the [virtualenv documentation][virtualenv].*
|
**Note:** To exit the virtualenv environment at any time, just type `deactivate`. For more information see the [virtualenv documentation][virtualenv].
|
||||||
|
|
||||||
## Getting started
|
## Getting started
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user