Skip to content

Commit d845bbd

Browse files
authored
Add Orjson renderer and parser for drf (#816)
* Add orjson-renderer * upd uv lock and sorted pyproject * Custom parser/renderer
1 parent 68cce9a commit d845bbd

File tree

5 files changed

+469
-399
lines changed

5 files changed

+469
-399
lines changed

{{ cookiecutter.name }}/pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ dependencies = [
1919
"djangorestframework-camel-case>=1.4.2",
2020
"djangorestframework-simplejwt[crypto]>=5.5.0",
2121
"djangorestframework>=3.15.2",
22+
"drf-orjson-renderer>=1.7.3",
2223
"drf-spectacular[sidecar]>=0.28.0",
2324
"pillow>=11.2.1",
2425
"psycopg[binary]>=3.2.6",
@@ -224,6 +225,7 @@ module = [
224225
"celery.*",
225226
"django_filters.*",
226227
"djangorestframework_camel_case.*",
228+
"drf_orjson_renderer.*",
227229
"ipware.*",
228230
"mixer.*",
229231
]
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from typing import IO, Any
2+
3+
from djangorestframework_camel_case.settings import api_settings
4+
from djangorestframework_camel_case.util import underscoreize
5+
from drf_orjson_renderer.parsers import ORJSONParser
6+
from rest_framework.exceptions import ParseError
7+
8+
9+
class AppJSONParser(ORJSONParser):
10+
"""Combination of ORJSONParser and CamelCaseJSONParser"""
11+
12+
# djangorestframework_camel_case parameter
13+
# details: https://github.com/vbabiy/djangorestframework-camel-case?tab=readme-ov-file#underscoreize-options
14+
json_underscoreize = api_settings.JSON_UNDERSCOREIZE
15+
16+
def parse(self, stream: IO[Any], media_type: Any = None, parser_context: Any = None) -> Any:
17+
try:
18+
data = super().parse(stream, media_type, parser_context)
19+
return underscoreize(data, **self.json_underscoreize)
20+
except ValueError as exc:
21+
raise ParseError(f"JSON parse error - {exc}")
Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
1-
from djangorestframework_camel_case.render import CamelCaseJSONRenderer
1+
from typing import Any
22

3+
from djangorestframework_camel_case.util import camelize
4+
from drf_orjson_renderer.renderers import ORJSONRenderer
5+
6+
7+
class AppJSONRenderer(ORJSONRenderer):
8+
"""Combination of CamelCaseJSONRenderer and ORJSONRenderer"""
39

4-
class AppJSONRenderer(CamelCaseJSONRenderer):
510
charset = "utf-8" # force DRF to add charset header to the content-type
611
json_underscoreize = {"no_underscore_before_number": True} # https://github.com/vbabiy/djangorestframework-camel-case#underscoreize-options
12+
13+
def render(self, data: Any, *args: Any, **kwargs: Any) -> bytes:
14+
return super().render(camelize(data, **self.json_underscoreize), *args, **kwargs)

{{ cookiecutter.name }}/src/app/conf/api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"app.api.renderers.AppJSONRenderer",
1919
],
2020
"DEFAULT_PARSER_CLASSES": [
21-
"djangorestframework_camel_case.parser.CamelCaseJSONParser",
21+
"app.api.parsers.AppJSONParser",
2222
"djangorestframework_camel_case.parser.CamelCaseMultiPartParser",
2323
"djangorestframework_camel_case.parser.CamelCaseFormParser",
2424
],

0 commit comments

Comments
 (0)