From 4b691c402707775c3048a90531024f3bc5be6f91 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Thu, 20 Sep 2012 13:06:27 +0100 Subject: Change package name: djangorestframework -> rest_framework --- rest_framework/response.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 rest_framework/response.py (limited to 'rest_framework/response.py') diff --git a/rest_framework/response.py b/rest_framework/response.py new file mode 100644 index 00000000..29034e25 --- /dev/null +++ b/rest_framework/response.py @@ -0,0 +1,39 @@ +from django.template.response import SimpleTemplateResponse +from django.core.handlers.wsgi import STATUS_CODE_TEXT + + +class Response(SimpleTemplateResponse): + """ + An HttpResponse that allows it's data to be rendered into + arbitrary media types. + """ + + def __init__(self, data=None, status=None, headers=None, + renderer=None, media_type=None): + """ + Alters the init arguments slightly. + For example, drop 'template_name', and instead use 'data'. + + Setting 'renderer' and 'media_type' will typically be defered, + For example being set automatically by the `APIView`. + """ + super(Response, self).__init__(None, status=status) + self.data = data + self.headers = headers and headers[:] or [] + self.renderer = renderer + self.media_type = media_type + + @property + def rendered_content(self): + self['Content-Type'] = self.renderer.media_type + if self.data is None: + return self.renderer.render() + return self.renderer.render(self.data, self.media_type) + + @property + def status_text(self): + """ + Returns reason text corresponding to our HTTP response status code. + Provided for convenience. + """ + return STATUS_CODE_TEXT.get(self.status_code, '') -- cgit v1.2.3 From d9cba6398e2323b8d8cd34f791442528517e01b4 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Thu, 20 Sep 2012 17:44:34 +0100 Subject: Clean up bits of templates etc --- rest_framework/response.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'rest_framework/response.py') diff --git a/rest_framework/response.py b/rest_framework/response.py index 29034e25..61e677a5 100644 --- a/rest_framework/response.py +++ b/rest_framework/response.py @@ -1,5 +1,5 @@ -from django.template.response import SimpleTemplateResponse from django.core.handlers.wsgi import STATUS_CODE_TEXT +from django.template.response import SimpleTemplateResponse class Response(SimpleTemplateResponse): -- cgit v1.2.3 From b4cd699b758c3a891f7c434069ac76084250a57a Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Fri, 21 Sep 2012 13:12:10 +0100 Subject: Tweak media_type -> accepted_media_type. Need to document, but marginally less confusing --- rest_framework/response.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'rest_framework/response.py') diff --git a/rest_framework/response.py b/rest_framework/response.py index 61e677a5..0ec87e0a 100644 --- a/rest_framework/response.py +++ b/rest_framework/response.py @@ -9,7 +9,7 @@ class Response(SimpleTemplateResponse): """ def __init__(self, data=None, status=None, headers=None, - renderer=None, media_type=None): + renderer=None, accepted_media_type=None): """ Alters the init arguments slightly. For example, drop 'template_name', and instead use 'data'. @@ -21,14 +21,15 @@ class Response(SimpleTemplateResponse): self.data = data self.headers = headers and headers[:] or [] self.renderer = renderer - self.media_type = media_type + self.accepted_media_type = accepted_media_type @property def rendered_content(self): self['Content-Type'] = self.renderer.media_type if self.data is None: return self.renderer.render() - return self.renderer.render(self.data, self.media_type) + render_media_type = self.accepted_media_type or self.renderer.media_type + return self.renderer.render(self.data, render_media_type) @property def status_text(self): -- cgit v1.2.3 From 3f7371c796a420cc077cf79b210d401c77b77815 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Fri, 21 Sep 2012 13:15:31 +0100 Subject: Tweak media_type -> accepted_media_type. Need to document, but marginally less confusing --- rest_framework/response.py | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'rest_framework/response.py') diff --git a/rest_framework/response.py b/rest_framework/response.py index 0ec87e0a..24c9d595 100644 --- a/rest_framework/response.py +++ b/rest_framework/response.py @@ -21,6 +21,14 @@ class Response(SimpleTemplateResponse): self.data = data self.headers = headers and headers[:] or [] self.renderer = renderer + + # Accepted media type is the portion of the request Accept header + # that the renderer satisfied. It could be '*/*', or somthing like + # 'application/json; indent=4' + # + # This is NOT the value that will be returned in the 'Content-Type' + # header, but we do need to know the value in case there are + # any specific parameters which affect the rendering process. self.accepted_media_type = accepted_media_type @property -- cgit v1.2.3 From 064e1ba91ff36cda76d3e5eecdc7a0dd2c160f46 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Fri, 21 Sep 2012 13:16:08 +0100 Subject: Tweak media_type -> accepted_media_type. Need to document, but marginally less confusing --- rest_framework/response.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'rest_framework/response.py') diff --git a/rest_framework/response.py b/rest_framework/response.py index 24c9d595..90516837 100644 --- a/rest_framework/response.py +++ b/rest_framework/response.py @@ -24,7 +24,7 @@ class Response(SimpleTemplateResponse): # Accepted media type is the portion of the request Accept header # that the renderer satisfied. It could be '*/*', or somthing like - # 'application/json; indent=4' + # application/json; indent=4 # # This is NOT the value that will be returned in the 'Content-Type' # header, but we do need to know the value in case there are -- cgit v1.2.3 From 43d3634e892e303ca377265d3176e8313f19563f Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Sun, 30 Sep 2012 15:55:24 +0100 Subject: Docs tweaking --- rest_framework/response.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'rest_framework/response.py') diff --git a/rest_framework/response.py b/rest_framework/response.py index 90516837..db6bf3e2 100644 --- a/rest_framework/response.py +++ b/rest_framework/response.py @@ -33,6 +33,8 @@ class Response(SimpleTemplateResponse): @property def rendered_content(self): + assert self.renderer, "No renderer set on Response" + self['Content-Type'] = self.renderer.media_type if self.data is None: return self.renderer.render() -- cgit v1.2.3 From d07dc77e91c1f99b47915b3cef30b565f2618e82 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Fri, 5 Oct 2012 10:23:47 +0100 Subject: Accepted media type uses most specific of client/renderer media types. --- rest_framework/response.py | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) (limited to 'rest_framework/response.py') diff --git a/rest_framework/response.py b/rest_framework/response.py index db6bf3e2..fca631c3 100644 --- a/rest_framework/response.py +++ b/rest_framework/response.py @@ -20,26 +20,21 @@ class Response(SimpleTemplateResponse): super(Response, self).__init__(None, status=status) self.data = data self.headers = headers and headers[:] or [] - self.renderer = renderer - - # Accepted media type is the portion of the request Accept header - # that the renderer satisfied. It could be '*/*', or somthing like - # application/json; indent=4 - # - # This is NOT the value that will be returned in the 'Content-Type' - # header, but we do need to know the value in case there are - # any specific parameters which affect the rendering process. + + self.accepted_renderer = renderer self.accepted_media_type = accepted_media_type @property def rendered_content(self): - assert self.renderer, "No renderer set on Response" + renderer = self.accepted_renderer + + assert renderer, "No renderer set on Response" - self['Content-Type'] = self.renderer.media_type + self['content-type'] = self.accepted_media_type if self.data is None: - return self.renderer.render() - render_media_type = self.accepted_media_type or self.renderer.media_type - return self.renderer.render(self.data, render_media_type) + return renderer.render() + + return renderer.render(self.data, self.accepted_media_type) @property def status_text(self): -- cgit v1.2.3 From 26c7d6df6c0a12a2e19e07951b93de80bbfdf91c Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Fri, 5 Oct 2012 12:13:44 +0100 Subject: HTMLTemplateRenderer working --- rest_framework/response.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'rest_framework/response.py') diff --git a/rest_framework/response.py b/rest_framework/response.py index fca631c3..796750fc 100644 --- a/rest_framework/response.py +++ b/rest_framework/response.py @@ -8,8 +8,8 @@ class Response(SimpleTemplateResponse): arbitrary media types. """ - def __init__(self, data=None, status=None, headers=None, - renderer=None, accepted_media_type=None): + def __init__(self, data=None, status=None, + template_name=None, headers=None): """ Alters the init arguments slightly. For example, drop 'template_name', and instead use 'data'. @@ -20,21 +20,21 @@ class Response(SimpleTemplateResponse): super(Response, self).__init__(None, status=status) self.data = data self.headers = headers and headers[:] or [] - - self.accepted_renderer = renderer - self.accepted_media_type = accepted_media_type + self.template_name = template_name @property def rendered_content(self): renderer = self.accepted_renderer + media_type = self.accepted_media_type - assert renderer, "No renderer set on Response" + assert renderer, "No accepted renderer set on Response" + assert media_type, "No accepted media type set on Response" - self['content-type'] = self.accepted_media_type + self['content-type'] = media_type if self.data is None: return renderer.render() - return renderer.render(self.data, self.accepted_media_type) + return renderer.render(self.data, media_type) @property def status_text(self): -- cgit v1.2.3 From 2575ea92aad3608142cfdd3ede5ee1b53e2064ba Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Fri, 5 Oct 2012 13:04:34 +0100 Subject: Docs for template responses --- rest_framework/response.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'rest_framework/response.py') diff --git a/rest_framework/response.py b/rest_framework/response.py index 796750fc..9a633a8a 100644 --- a/rest_framework/response.py +++ b/rest_framework/response.py @@ -8,7 +8,7 @@ class Response(SimpleTemplateResponse): arbitrary media types. """ - def __init__(self, data=None, status=None, + def __init__(self, data=None, status=200, template_name=None, headers=None): """ Alters the init arguments slightly. @@ -30,7 +30,7 @@ class Response(SimpleTemplateResponse): assert renderer, "No accepted renderer set on Response" assert media_type, "No accepted media type set on Response" - self['content-type'] = media_type + self['Content-Type'] = media_type if self.data is None: return renderer.render() -- cgit v1.2.3 From 648d2be29b0738999742f4d844caab7b7652d1ad Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Wed, 10 Oct 2012 12:15:18 +0100 Subject: Make sure JSON output in Browseable API is nicely indented --- rest_framework/response.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'rest_framework/response.py') diff --git a/rest_framework/response.py b/rest_framework/response.py index 9a633a8a..7a459c8f 100644 --- a/rest_framework/response.py +++ b/rest_framework/response.py @@ -24,17 +24,17 @@ class Response(SimpleTemplateResponse): @property def rendered_content(self): - renderer = self.accepted_renderer - media_type = self.accepted_media_type + renderer = getattr(self, 'accepted_renderer', None) + media_type = getattr(self, 'accepted_media_type', None) + context = getattr(self, 'renderer_context', None) - assert renderer, "No accepted renderer set on Response" - assert media_type, "No accepted media type set on Response" + assert renderer, ".accepted_renderer not set on Response" + assert media_type, ".accepted_media_type not set on Response" + assert context, ".renderer_context not set on Response" + context['response'] = self self['Content-Type'] = media_type - if self.data is None: - return renderer.render() - - return renderer.render(self.data, media_type) + return renderer.render(self.data, media_type, context) @property def status_text(self): @@ -42,4 +42,6 @@ class Response(SimpleTemplateResponse): Returns reason text corresponding to our HTTP response status code. Provided for convenience. """ + # TODO: Deprecate and use a template tag instead + # TODO: Status code text for RFC 6585 status codes return STATUS_CODE_TEXT.get(self.status_code, '') -- cgit v1.2.3