diff options
| author | Tom Christie | 2012-10-05 14:48:33 +0100 |
|---|---|---|
| committer | Tom Christie | 2012-10-05 14:48:33 +0100 |
| commit | 9d8bce8f5b0915223f57d9fe3d4b63029cfc64c2 (patch) | |
| tree | a0a3f9e5a80335dcba3315f81b498e3aed241dcb /rest_framework/request.py | |
| parent | 3e862c77379b2f84356e2e8f0be20b7aca5b9e89 (diff) | |
| download | django-rest-framework-9d8bce8f5b0915223f57d9fe3d4b63029cfc64c2.tar.bz2 | |
Remove Parser.can_handle_request()
Diffstat (limited to 'rest_framework/request.py')
| -rw-r--r-- | rest_framework/request.py | 52 |
1 files changed, 23 insertions, 29 deletions
diff --git a/rest_framework/request.py b/rest_framework/request.py index e254cf8e..ac15defc 100644 --- a/rest_framework/request.py +++ b/rest_framework/request.py @@ -34,8 +34,8 @@ def clone_request(request, method): HTTP method. Used for checking permissions against other methods. """ ret = Request(request._request, - request.parser_classes, - request.authentication_classes) + request.parsers, + request.authenticators) ret._data = request._data ret._files = request._files ret._content_type = request._content_type @@ -60,27 +60,20 @@ class Request(object): _CONTENT_PARAM = api_settings.FORM_CONTENT_OVERRIDE _CONTENTTYPE_PARAM = api_settings.FORM_CONTENTTYPE_OVERRIDE - def __init__(self, request, parser_classes=None, authentication_classes=None): + def __init__(self, request, parsers=None, authenticators=None, + negotiator=None): self._request = request - self.parser_classes = parser_classes or () - self.authentication_classes = authentication_classes or () + self.parsers = parsers or () + self.authenticators = authenticators or () + self.negotiator = negotiator or self._default_negotiator() self._data = Empty self._files = Empty self._method = Empty self._content_type = Empty self._stream = Empty - def get_parsers(self): - """ - Instantiates and returns the list of parsers the request will use. - """ - return [parser() for parser in self.parser_classes] - - def get_authentications(self): - """ - Instantiates and returns the list of parsers the request will use. - """ - return [authentication() for authentication in self.authentication_classes] + def _default_negotiator(self): + return api_settings.DEFAULT_CONTENT_NEGOTIATION() @property def method(self): @@ -254,26 +247,27 @@ class Request(object): if self.stream is None or self.content_type is None: return (None, None) - for parser in self.get_parsers(): - if parser.can_handle_request(self.content_type): - parsed = parser.parse(self.stream, meta=self.META, - upload_handlers=self.upload_handlers) - # Parser classes may return the raw data, or a - # DataAndFiles object. Unpack the result as required. - try: - return (parsed.data, parsed.files) - except AttributeError: - return (parsed, None) + parser = self.negotiator.select_parser(self.parsers, self.content_type) + + if not parser: + raise exceptions.UnsupportedMediaType(self._content_type) - raise exceptions.UnsupportedMediaType(self._content_type) + parsed = parser.parse(self.stream, meta=self.META, + upload_handlers=self.upload_handlers) + # Parser classes may return the raw data, or a + # DataAndFiles object. Unpack the result as required. + try: + return (parsed.data, parsed.files) + except AttributeError: + return (parsed, None) def _authenticate(self): """ Attempt to authenticate the request using each authentication instance in turn. Returns a two-tuple of (user, authtoken). """ - for authentication in self.get_authentications(): - user_auth_tuple = authentication.authenticate(self) + for authenticator in self.authenticators: + user_auth_tuple = authenticator.authenticate(self) if not user_auth_tuple is None: return user_auth_tuple return self._not_authenticated() |
