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 aQueryDict.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')