diff options
| author | Tom Christie | 2012-09-14 23:17:12 +0100 |
|---|---|---|
| committer | Tom Christie | 2012-09-14 23:17:12 +0100 |
| commit | 6543ccd244a8d482b8aec18b5d03ee964292f17f (patch) | |
| tree | 72e0ae8812e3606d53cd117156d633e1833c75fc /djangorestframework/views.py | |
| parent | 5036638d0c8a9f53d865e7b6bfd11b4a5534ba6e (diff) | |
| download | django-rest-framework-6543ccd244a8d482b8aec18b5d03ee964292f17f.tar.bz2 | |
Cleaner content negotiation. Occurs after permissions. Optional 'force' flag.
Diffstat (limited to 'djangorestframework/views.py')
| -rw-r--r-- | djangorestframework/views.py | 29 |
1 files changed, 6 insertions, 23 deletions
diff --git a/djangorestframework/views.py b/djangorestframework/views.py index d1330866..32d403ea 100644 --- a/djangorestframework/views.py +++ b/djangorestframework/views.py @@ -197,24 +197,13 @@ class APIView(_View): """ return [throttle(self) for throttle in self.throttle_classes] - def content_negotiation(self, request): + def content_negotiation(self, request, force=False): """ Determine which renderer and media type to use render the response. """ renderers = self.get_renderers() - - if self.format: - # If there is a '.json' style format suffix, only use - # renderers that accept that format. - fallback = renderers[0] - renderers = [renderer for renderer in renderers - if renderer.can_handle_format(self.format)] - if not renderers: - self.format404 = True - return (fallback, fallback.media_type) - conneg = self.content_negotiation_class() - return conneg.negotiate(request, renderers) + return conneg.negotiate(request, renderers, self.format, force) def check_permissions(self, request, obj=None): """ @@ -244,19 +233,17 @@ class APIView(_View): Runs anything that needs to occur prior to calling the method handlers. """ self.format = self.get_format_suffix(**kwargs) - self.renderer, self.media_type = self.content_negotiation(request) self.check_permissions(request) self.check_throttles(request) - # If the request included a non-existant .format URL suffix, - # raise 404, but only after first making permission checks. - if getattr(self, 'format404', None): - raise Http404() + self.renderer, self.media_type = self.content_negotiation(request) def finalize_response(self, request, response, *args, **kwargs): """ Returns the final response object. """ if isinstance(response, Response): + if not getattr(self, 'renderer', None): + self.renderer, self.media_type = self.content_negotiation(request, force=True) response.renderer = self.renderer response.media_type = self.media_type @@ -270,11 +257,7 @@ class APIView(_View): Handle any exception that occurs, by returning an appropriate response, or re-raising the error. """ - if isinstance(exc, exceptions.NotAcceptable): - # Fall back to default renderer - self.renderer = exc.available_renderers[0] - self.media_type = exc.available_renderers[0].media_type - elif isinstance(exc, exceptions.Throttled): + if isinstance(exc, exceptions.Throttled): # Throttle wait header self.headers['X-Throttle-Wait-Seconds'] = '%d' % exc.wait |
