aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework
diff options
context:
space:
mode:
authorTom Christie2013-05-20 21:18:17 +0100
committerTom Christie2013-05-20 21:18:17 +0100
commitaef7ac72cc49db0745edcfe083220570abbbe3a7 (patch)
treee20b06bad897714f7756f0fd468485d0652c3835 /rest_framework
parentf19e0d544fdcd318c2bde2057d91777beda78915 (diff)
downloaddjango-rest-framework-aef7ac72cc49db0745edcfe083220570abbbe3a7.tar.bz2
content type may be set explicitly on the response
Diffstat (limited to 'rest_framework')
-rw-r--r--rest_framework/response.py18
-rw-r--r--rest_framework/tests/response.py13
2 files changed, 16 insertions, 15 deletions
diff --git a/rest_framework/response.py b/rest_framework/response.py
index 3e0dd106..110ccb13 100644
--- a/rest_framework/response.py
+++ b/rest_framework/response.py
@@ -18,7 +18,7 @@ class Response(SimpleTemplateResponse):
def __init__(self, data=None, status=200,
template_name=None, headers=None,
- exception=False, charset=None):
+ exception=False, content_type=None):
"""
Alters the init arguments slightly.
For example, drop 'template_name', and instead use 'data'.
@@ -30,7 +30,7 @@ class Response(SimpleTemplateResponse):
self.data = data
self.template_name = template_name
self.exception = exception
- self.charset = charset
+ self.content_type = content_type
if headers:
for name, value in six.iteritems(headers):
@@ -47,18 +47,20 @@ class Response(SimpleTemplateResponse):
assert context, ".renderer_context not set on Response"
context['response'] = self
- if self.charset is None:
- self.charset = renderer.charset
+ charset = renderer.charset
+ content_type = self.content_type
- if self.charset is not None:
- content_type = "{0}; charset={1}".format(media_type, self.charset)
- else:
+ if content_type is None and charset is not None:
+ content_type = "{0}; charset={1}".format(media_type, charset)
+ elif content_type is None:
content_type = media_type
self['Content-Type'] = content_type
ret = renderer.render(self.data, media_type, context)
if isinstance(ret, six.text_type):
- return bytes(ret.encode(self.charset))
+ assert charset, 'renderer returned unicode, and did not specify ' \
+ 'a charset value.'
+ return bytes(ret.encode(charset))
return ret
@property
diff --git a/rest_framework/tests/response.py b/rest_framework/tests/response.py
index a527baa3..12b8cda2 100644
--- a/rest_framework/tests/response.py
+++ b/rest_framework/tests/response.py
@@ -60,11 +60,11 @@ class MockView(APIView):
return Response(DUMMYCONTENT, status=DUMMYSTATUS)
-class MockViewSettingCharset(APIView):
+class MockViewSettingContentType(APIView):
renderer_classes = (RendererA, RendererB, RendererC)
def get(self, request, **kwargs):
- return Response(DUMMYCONTENT, status=DUMMYSTATUS, charset='setbyview')
+ return Response(DUMMYCONTENT, status=DUMMYSTATUS, content_type='setbyview')
class HTMLView(APIView):
@@ -81,7 +81,7 @@ class HTMLView1(APIView):
return Response('text')
urlpatterns = patterns('',
- url(r'^setbyview$', MockViewSettingCharset.as_view(renderer_classes=[RendererA, RendererB, RendererC])),
+ url(r'^setbyview$', MockViewSettingContentType.as_view(renderer_classes=[RendererA, RendererB, RendererC])),
url(r'^.*\.(?P<format>.+)$', MockView.as_view(renderer_classes=[RendererA, RendererB, RendererC])),
url(r'^$', MockView.as_view(renderer_classes=[RendererA, RendererB, RendererC])),
url(r'^html$', HTMLView.as_view()),
@@ -217,11 +217,10 @@ class Issue807Testts(TestCase):
expected = "{0}; charset={1}".format(RendererC.media_type, RendererC.charset)
self.assertEqual(expected, resp['Content-Type'])
- def test_charset_set_explictly_on_response(self):
+ def test_content_type_set_explictly_on_response(self):
"""
- The charset may be set explictly on the response.
+ The content type may be set explictly on the response.
"""
headers = {"HTTP_ACCEPT": RendererC.media_type}
resp = self.client.get('/setbyview', **headers)
- expected = "{0}; charset={1}".format(RendererC.media_type, 'setbyview')
- self.assertEqual(expected, resp['Content-Type'])
+ self.assertEqual('setbyview', resp['Content-Type'])