aboutsummaryrefslogtreecommitdiffstats
path: root/djangorestframework/renderers.py
diff options
context:
space:
mode:
Diffstat (limited to 'djangorestframework/renderers.py')
-rw-r--r--djangorestframework/renderers.py55
1 files changed, 37 insertions, 18 deletions
diff --git a/djangorestframework/renderers.py b/djangorestframework/renderers.py
index 18ffbf66..aae2cab2 100644
--- a/djangorestframework/renderers.py
+++ b/djangorestframework/renderers.py
@@ -12,7 +12,7 @@ from django.template import RequestContext, loader
from django.utils import simplejson as json
-from djangorestframework.compat import apply_markdown
+from djangorestframework.compat import apply_markdown, yaml
from djangorestframework.utils import dict2xml, url_resolves
from djangorestframework.utils.breadcrumbs import get_breadcrumbs
from djangorestframework.utils.description import get_name, get_description
@@ -21,7 +21,6 @@ from djangorestframework import VERSION
import string
from urllib import quote_plus
-import yaml
__all__ = (
'BaseRenderer',
@@ -40,8 +39,11 @@ class BaseRenderer(object):
All renderers must extend this class, set the :attr:`media_type` attribute,
and override the :meth:`render` method.
"""
+
+ _FORMAT_QUERY_PARAM = 'format'
media_type = None
+ format = None
def __init__(self, view):
self.view = view
@@ -58,6 +60,11 @@ class BaseRenderer(object):
This may be overridden to provide for other behavior, but typically you'll
instead want to just set the :attr:`media_type` attribute on the class.
"""
+ format = self.view.kwargs.get(self._FORMAT_QUERY_PARAM, None)
+ if format is None:
+ format = self.view.request.GET.get(self._FORMAT_QUERY_PARAM, None)
+ if format is not None:
+ return format == self.format
return media_type_matches(self.media_type, accept)
def render(self, obj=None, media_type=None):
@@ -84,6 +91,7 @@ class JSONRenderer(BaseRenderer):
"""
media_type = 'application/json'
+ format = 'json'
def render(self, obj=None, media_type=None):
"""
@@ -111,6 +119,7 @@ class XMLRenderer(BaseRenderer):
"""
media_type = 'application/xml'
+ format = 'xml'
def render(self, obj=None, media_type=None):
"""
@@ -120,20 +129,27 @@ class XMLRenderer(BaseRenderer):
return ''
return dict2xml(obj)
-class YAMLRenderer(BaseRenderer):
- """
- Renderer which serializes to YAML.
- """
- media_type = 'application/yaml'
-
- def render(self, obj=None, media_type=None):
+if yaml:
+ class YAMLRenderer(BaseRenderer):
"""
- Renders *obj* into serialized YAML.
+ Renderer which serializes to YAML.
"""
- if obj is None:
- return ''
- return yaml.dump(obj)
+
+ media_type = 'application/yaml'
+ format = 'yaml'
+
+ def render(self, obj=None, media_type=None):
+ """
+ Renders *obj* into serialized YAML.
+ """
+ if obj is None:
+ return ''
+
+ return yaml.dump(obj)
+else:
+ YAMLRenderer = None
+
class TemplateRenderer(BaseRenderer):
"""
@@ -303,12 +319,12 @@ class DocumentingTemplateRenderer(BaseRenderer):
'version': VERSION,
'markeddown': markeddown,
'breadcrumblist': breadcrumb_list,
- 'available_media_types': self.view._rendered_media_types,
+ 'available_formats': self.view._rendered_formats,
'put_form': put_form_instance,
'post_form': post_form_instance,
'login_url': login_url,
'logout_url': logout_url,
- 'ACCEPT_PARAM': getattr(self.view, '_ACCEPT_QUERY_PARAM', None),
+ 'FORMAT_PARAM': self._FORMAT_QUERY_PARAM,
'METHOD_PARAM': getattr(self.view, '_METHOD_PARAM', None),
'ADMIN_MEDIA_PREFIX': settings.ADMIN_MEDIA_PREFIX
})
@@ -331,6 +347,7 @@ class DocumentingHTMLRenderer(DocumentingTemplateRenderer):
"""
media_type = 'text/html'
+ format = 'html'
template = 'renderer.html'
@@ -342,6 +359,7 @@ class DocumentingXHTMLRenderer(DocumentingTemplateRenderer):
"""
media_type = 'application/xhtml+xml'
+ format = 'xhtml'
template = 'renderer.html'
@@ -353,6 +371,7 @@ class DocumentingPlainTextRenderer(DocumentingTemplateRenderer):
"""
media_type = 'text/plain'
+ format = 'txt'
template = 'renderer.txt'
@@ -360,7 +379,7 @@ DEFAULT_RENDERERS = ( JSONRenderer,
DocumentingHTMLRenderer,
DocumentingXHTMLRenderer,
DocumentingPlainTextRenderer,
- XMLRenderer,
- YAMLRenderer )
-
+ XMLRenderer )
+if YAMLRenderer:
+ DEFAULT_RENDERERS += (YAMLRenderer,)