This commit is contained in:
Iliyan Angelov
2025-09-19 11:58:53 +03:00
parent 306b20e24a
commit 6b247e5b9f
11423 changed files with 1500615 additions and 778 deletions

View File

@@ -0,0 +1,12 @@
from typing import Any
class BaseSerializer:
def __init__(self, options):
pass
def dumps(self, value: Any) -> bytes:
raise NotImplementedError
def loads(self, value: bytes) -> Any:
raise NotImplementedError

View File

@@ -0,0 +1,16 @@
import json
from typing import Any
from django.core.serializers.json import DjangoJSONEncoder
from django_redis.serializers.base import BaseSerializer
class JSONSerializer(BaseSerializer):
encoder_class = DjangoJSONEncoder
def dumps(self, value: Any) -> bytes:
return json.dumps(value, cls=self.encoder_class).encode()
def loads(self, value: bytes) -> Any:
return json.loads(value.decode())

View File

@@ -0,0 +1,13 @@
from typing import Any
import msgpack
from django_redis.serializers.base import BaseSerializer
class MSGPackSerializer(BaseSerializer):
def dumps(self, value: Any) -> bytes:
return msgpack.dumps(value)
def loads(self, value: bytes) -> Any:
return msgpack.loads(value, raw=False)

View File

@@ -0,0 +1,34 @@
import pickle
from typing import Any
from django.core.exceptions import ImproperlyConfigured
from django_redis.serializers.base import BaseSerializer
class PickleSerializer(BaseSerializer):
def __init__(self, options) -> None:
self._pickle_version = pickle.DEFAULT_PROTOCOL
self.setup_pickle_version(options)
super().__init__(options=options)
def setup_pickle_version(self, options) -> None:
if "PICKLE_VERSION" in options:
try:
self._pickle_version = int(options["PICKLE_VERSION"])
if self._pickle_version > pickle.HIGHEST_PROTOCOL:
error_message = (
f"PICKLE_VERSION can't be higher than pickle.HIGHEST_PROTOCOL:"
f" {pickle.HIGHEST_PROTOCOL}"
)
raise ImproperlyConfigured(error_message)
except (ValueError, TypeError) as e:
error_message = "PICKLE_VERSION value must be an integer"
raise ImproperlyConfigured(error_message) from e
def dumps(self, value: Any) -> bytes:
return pickle.dumps(value, self._pickle_version)
def loads(self, value: bytes) -> Any:
return pickle.loads(value)