Skip to content

Commit 6a122ee

Browse files
committed
Abstract orjson for message.py.
1 parent 56cee48 commit 6a122ee

File tree

2 files changed

+24
-12
lines changed

2 files changed

+24
-12
lines changed

django_unicorn/message.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@
22

33
from django.http.response import HttpResponseRedirect
44

5-
import orjson
6-
75
from .components import HashUpdate, LocationUpdate, PollUpdate
86
from .errors import UnicornViewError
9-
from .serializer import dumps
7+
from .serializer import JSONDecodeError, dumps, loads
108
from .utils import generate_checksum
119

1210

@@ -22,9 +20,9 @@ def __init__(self, request):
2220
self.body = {}
2321

2422
try:
25-
self.body = orjson.loads(request.body)
23+
self.body = loads(request.body)
2624
assert self.body, "Invalid JSON body"
27-
except orjson.JSONDecodeError as e:
25+
except JSONDecodeError as e:
2826
raise UnicornViewError("Body could not be parsed") from e
2927

3028
self.data = self.body.get("data")
@@ -49,7 +47,7 @@ def validate_checksum(self):
4947
checksum = self.body.get("checksum")
5048
assert checksum, "Missing checksum"
5149

52-
generated_checksum = generate_checksum(orjson.dumps(self.data))
50+
generated_checksum = generate_checksum(dumps(self.data, fix_floats=False))
5351
assert checksum == generated_checksum, "Checksum does not match"
5452

5553

@@ -93,8 +91,8 @@ def value(self, value):
9391

9492
def get_data(self):
9593
try:
96-
serialized_value = orjson.loads(dumps(self.value))
97-
serialized_params = orjson.loads(dumps(self.params))
94+
serialized_value = loads(dumps(self.value))
95+
serialized_params = loads(dumps(self.params))
9896

9997
return {
10098
"method": self.method_name,

django_unicorn/serializer.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
import orjson
1414

1515

16+
class JSONDecodeError(Exception):
17+
pass
18+
19+
1620
def _get_model_dict(obj: Any) -> dict:
1721
"""
1822
Serializes Django models. Uses the built-in Django JSON serializer, but moves the data around to
@@ -108,22 +112,32 @@ def _dumps(serialized_data):
108112
return dumped_data
109113

110114

111-
def dumps(data: dict) -> str:
115+
def dumps(data: dict, fix_floats: bool = True) -> str:
112116
"""
113117
Converts the passed-in dictionary to a string representation.
114118
115119
Handles the following objects: dataclass, datetime, enum, float, int, numpy, str, uuid,
116120
Django Model, Django QuerySet, any object with `to_json` method.
121+
122+
Args:
123+
param fix_floats: Whether any floats should be converted to strings. Defaults to `True`,
124+
but will be faster without it.
117125
"""
118126

119127
serialized_data = orjson.dumps(data, default=_json_serializer)
120128

121-
return _dumps(serialized_data)
129+
if fix_floats:
130+
return _dumps(serialized_data)
131+
132+
return serialized_data
122133

123134

124-
def loads(obj: str) -> dict:
135+
def loads(str: str) -> dict:
125136
"""
126137
Converts a string representation to dictionary.
127138
"""
128139

129-
return orjson.loads(obj)
140+
try:
141+
return orjson.loads(str)
142+
except orjson.JSONDecodeError as e:
143+
raise JSONDecodeError from e

0 commit comments

Comments
 (0)