Skip to content

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)