diff options
| author | Tom Christie | 2012-10-05 10:23:47 +0100 |
|---|---|---|
| committer | Tom Christie | 2012-10-05 10:23:47 +0100 |
| commit | d07dc77e91c1f99b47915b3cef30b565f2618e82 (patch) | |
| tree | 9f68ca55f685090f1672a557ce985931ccee47b3 /rest_framework/negotiation.py | |
| parent | ad5e6eb16f4db928e1fc8d0a6af4f9f4584f7b08 (diff) | |
| download | django-rest-framework-d07dc77e91c1f99b47915b3cef30b565f2618e82.tar.bz2 | |
Accepted media type uses most specific of client/renderer media types.
Diffstat (limited to 'rest_framework/negotiation.py')
| -rw-r--r-- | rest_framework/negotiation.py | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/rest_framework/negotiation.py b/rest_framework/negotiation.py index 0d3b368c..73ae7899 100644 --- a/rest_framework/negotiation.py +++ b/rest_framework/negotiation.py @@ -1,6 +1,6 @@ from rest_framework import exceptions from rest_framework.settings import api_settings -from rest_framework.utils.mediatypes import order_by_precedence +from rest_framework.utils.mediatypes import order_by_precedence, media_type_matches class BaseContentNegotiation(object): @@ -46,8 +46,16 @@ class DefaultContentNegotiation(object): for media_type_set in order_by_precedence(accepts): for renderer in renderers: for media_type in media_type_set: - if renderer.can_handle_media_type(media_type): - return renderer, media_type + if media_type_matches(renderer.media_type, media_type): + # Return the most specific media type as accepted. + if len(renderer.media_type) > len(media_type): + # Eg client requests '*/*' + # Accepted media type is 'application/json' + return renderer, renderer.media_type + else: + # Eg client requests 'application/json; indent=8' + # Accepted media type is 'application/json; indent=8' + return renderer, media_type raise exceptions.NotAcceptable(available_renderers=renderers) @@ -57,7 +65,7 @@ class DefaultContentNegotiation(object): so that we only negotiation against those that accept that format. """ renderers = [renderer for renderer in renderers - if renderer.can_handle_format(format)] + if renderer.format == format] if not renderers: raise exceptions.InvalidFormat(format) return renderers |
