diff options
| author | Tom Christie | 2012-10-15 13:27:50 +0100 | 
|---|---|---|
| committer | Tom Christie | 2012-10-15 13:27:50 +0100 | 
| commit | 9c1fba3483b7e81da0744464dcf23a5f12711de2 (patch) | |
| tree | d9370dc9fb9d2fea65192bf5ce4d7fb594d3ad0c /rest_framework/request.py | |
| parent | e88ca9637bd4f49659dd80ca7afd0f38adf07746 (diff) | |
| download | django-rest-framework-9c1fba3483b7e81da0744464dcf23a5f12711de2.tar.bz2 | |
Tweak parsers to take parser_context
Diffstat (limited to 'rest_framework/request.py')
| -rw-r--r-- | rest_framework/request.py | 29 | 
1 files changed, 24 insertions, 5 deletions
| diff --git a/rest_framework/request.py b/rest_framework/request.py index 7267b368..6f9cf09a 100644 --- a/rest_framework/request.py +++ b/rest_framework/request.py @@ -11,9 +11,18 @@ The wrapped request then offers a richer API, in particular :  """  from StringIO import StringIO +from django.http.multipartparser import parse_header  from rest_framework import exceptions  from rest_framework.settings import api_settings -from rest_framework.utils.mediatypes import is_form_media_type + + +def is_form_media_type(media_type): +    """ +    Return True if the media type is a valid form media type. +    """ +    base_media_type, params = parse_header(media_type) +    return base_media_type == 'application/x-www-form-urlencoded' or \ +           base_media_type == 'multipart/form-data'  class Empty(object): @@ -35,7 +44,8 @@ def clone_request(request, method):      """      ret = Request(request._request,                    request.parsers, -                  request.authenticators) +                  request.authenticators, +                  request.parser_context)      ret._data = request._data      ret._files = request._files      ret._content_type = request._content_type @@ -65,20 +75,30 @@ class Request(object):      _CONTENTTYPE_PARAM = api_settings.FORM_CONTENTTYPE_OVERRIDE      def __init__(self, request, parsers=None, authenticators=None, -                 negotiator=None): +                 negotiator=None, parser_context=None):          self._request = request          self.parsers = parsers or ()          self.authenticators = authenticators or ()          self.negotiator = negotiator or self._default_negotiator() +        self.parser_context = parser_context          self._data = Empty          self._files = Empty          self._method = Empty          self._content_type = Empty          self._stream = Empty +        if self.parser_context is None: +            self.parser_context = self._default_parser_context(request) +      def _default_negotiator(self):          return api_settings.DEFAULT_CONTENT_NEGOTIATION() +    def _default_parser_context(self, request): +        return { +            'upload_handlers': request.upload_handlers, +            'meta': request.META, +        } +      @property      def method(self):          """ @@ -253,8 +273,7 @@ class Request(object):          if not parser:              raise exceptions.UnsupportedMediaType(self.content_type) -        parsed = parser.parse(self.stream, meta=self.META, -                              upload_handlers=self.upload_handlers) +        parsed = parser.parse(self.stream, self.parser_context)          # Parser classes may return the raw data, or a          # DataAndFiles object.  Unpack the result as required.          try: | 
