Source code for django_orjson.rest_framework

from __future__ import annotations

from collections.abc import Callable
from typing import Any

import orjson
from django.conf import settings
from rest_framework.exceptions import ParseError
from rest_framework.parsers import JSONParser as BaseJSONParser
from rest_framework.renderers import JSONRenderer as BaseJSONRenderer

from django_orjson import default as django_orjson_default


[docs] class JSONRenderer(BaseJSONRenderer): # type: ignore[misc] default: Callable[[Any], Any] = staticmethod(django_orjson_default) option: int = 0 def render( self, data: Any, accepted_media_type: str | None = None, renderer_context: dict[str, Any] | None = None, ) -> bytes: if data is None: return b"" renderer_context = renderer_context or {} indent = self.get_indent(accepted_media_type, renderer_context) option = self.option if indent is not None: option |= orjson.OPT_INDENT_2 ret: bytes = orjson.dumps(data, default=self.default, option=option) return ret
[docs] class JSONParser(BaseJSONParser): # type: ignore[misc] renderer_class = JSONRenderer def parse( self, stream: Any, media_type: str | None = None, parser_context: dict[str, Any] | None = None, ) -> Any: parser_context = parser_context or {} encoding = parser_context.get("encoding", settings.DEFAULT_CHARSET) data = stream.read() if isinstance(data, bytes) and encoding.lower().replace("_", "-") not in ( "utf-8", "utf8", ): data = data.decode(encoding) try: return orjson.loads(data) except ValueError as exc: raise ParseError(f"JSON parse error - {exc}") from exc