Skip to content

Parsers

Parsers handle the incoming HTTP request body and parse it into native Python data types (available as request.data), which are then passed to serializers.

Built-in Parsers

DRF provides several built-in parsers:

  • JSONParser: Parses JSON request content.
  • FormParser: Parses HTML form content (application/x-www-form-urlencoded). Data is populated as a QueryDict.
  • MultiPartParser: Parses multipart HTML form content, which supports file uploads (multipart/form-data).
  • FileUploadParser: Parses raw file upload content, returning a single uploaded file.

Setting Parsers

You can configure parsers globally in your settings.py:

python
REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser'
    ]
}

Or override them on a per-view basis:

Class-Based Views

python
from rest_framework.parsers import JSONParser
from rest_framework.response import Response
from rest_framework.views import APIView

class ExampleView(APIView):
    parser_classes = [JSONParser]

    def post(self, request, format=None):
        return Response({'received data': request.data})

Function-Based Views

python
from rest_framework.decorators import api_view, parser_classes
from rest_framework.parsers import JSONParser
from rest_framework.response import Response

@api_view(['POST'])
@parser_classes([JSONParser])
def example_view(request):
    return Response({'received data': request.data})

Custom Parsers

To implement a custom parser, subclass BaseParser and override the .parse() method.

python
from rest_framework.parsers import BaseParser

class PlainTextParser(BaseParser):
    media_type = 'text/plain'

    def parse(self, stream, media_type=None, parser_context=None):
        return stream.read().decode('utf-8')