Django RestFramework JSON Renderer Backed by orjson
Project description
Django Rest Framework ORJSON Renderer
drf_orjson_renderer
is JSON renderer and parser for Django Rest Framework
using the orjson library. Backed by
Rust, orjson is safe, correct and fast. ⚡️
In addition, unlike some performance optimized DRF renderers, It also renders pretty printed JSON when requests are made via RestFramework's BrowsableAPI.
You get:
- The safety of Rust
- The speed of orjson when requests are made with
Accept: appliation/json
HTTP header or when requests are made with an unspecifiedAccept
header. - The convenience of formatted output when requested with
Accept: text/html
. - The ability to pass your own
default
function definition.
Installation
pip install drf_orjson_renderer
You can then set the ORJSONRenderer
class as your default renderer in your settings.py
REST_FRAMEWORK = {
"DEFAULT_RENDERER_CLASSES": (
"drf_orjson_renderer.renderers.ORJSONRenderer",
"rest_framework.renderers.BrowsableAPIRenderer",
),
}
Also you can set the ORJSONParser
class as your default parser in your settings.py
REST_FRAMEWORK = {
"DEFAULT_PARSER_CLASSES": (
"drf_orjson_renderer.parsers.ORJSONParser",
),
}
Passing Your Own default
Function
By default, the ORJSONRenderer
will pass a default
function as a helper for
serializing objects that orjson doesn't recognize. That should cover the most
common cases found in a Django web application. If you find you have an object
it doesn't recognize you can pass your own default function by overriding the
get_renderer_context()
method of your view:
from rest_framework.views import APIView
from rest_framework.response import Response
class MyView(APIView):
def default(self, obj):
if isinstance(obj, MyComplexData):
return dict(obj)
def get_renderer_context(self):
renderer_context = super().get_renderer_context()
renderer_context["default_function"] = self.default
return renderer_context
def get(self, request, *args, **kwargs):
my_complex_data = MyComplexData()
return Response(data=my_complex_data)
If you know your data is already in a format orjson natively
recognizes you can get a small
performance boost by passing None
to the renderer_context
:
def get_renderer_context(self):
renderer_context = super().get_renderer_context()
renderer_context["default_function"] = None
return renderer_context
Benchmarks
See the orjson Benchmarks for more information
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for drf_orjson_renderer-1.0.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 72efa70aeb9b0818fd26f6a420a5f09084ac69384a7dd0bdea4e602d6fa441df |
|
MD5 | d5d10054120c3981480d3543d74a5761 |
|
BLAKE2b-256 | ae8b4adc301a937087129b5e6eafe19c09519a869d3fa9e8407faf5ac317d4eb |
Hashes for drf_orjson_renderer-1.0.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 314a8869d7e738dffd0932c933546efb8849d5f5e77bef422f113ffd9878da27 |
|
MD5 | 14e9a69b47ea1d6083248678d1c6abe6 |
|
BLAKE2b-256 | 0e25fbd8d96c2a254c16bdf981f959fc29e3428cb1afa05d378e609ace5b25d9 |