Renderers
Renderers determine how your API responses are formatted (e.g., JSON, HTML, XML). Before a Response object is returned to the client, it must be rendered into a byte stream.
Built-in Renderers
DRF provides several built-in renderers:
JSONRenderer: Renders the request data into JSON, using utf-8 encoding.TemplateHTMLRenderer: Renders data to HTML, using Django's standard template rendering.StaticHTMLRenderer: Returns pre-rendered HTML without any further processing.BrowsableAPIRenderer: Renders data into HTML for the browsable API.AdminRenderer: Renders data into HTML for an admin-like interface.
Setting Renderers
You can set renderers globally in your settings.py:
python
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
]
}Or on a per-view basis:
Class-Based Views
python
from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response
from rest_framework.views import APIView
class UserCountView(APIView):
renderer_classes = [JSONRenderer]
def get(self, request, format=None):
user_count = User.objects.count()
return Response({'users': user_count})Function-Based Views
python
from rest_framework.decorators import api_view, renderer_classes
from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response
@api_view(['GET'])
@renderer_classes([JSONRenderer])
def user_count_view(request):
user_count = User.objects.count()
return Response({'users': user_count})Custom Renderers
To implement a custom renderer, subclass BaseRenderer and override the .render() method.
python
from rest_framework.renderers import BaseRenderer
class PlainTextRenderer(BaseRenderer):
media_type = 'text/plain'
format = 'txt'
def render(self, data, accepted_media_type=None, renderer_context=None):
return data.encode(self.charset)