Python 2.7和3.7.2兼容的django redis序列化程序

Python 2.7和3.7.2兼容的django redis序列化程序,django,pickle,django-redis,Django,Pickle,Django Redis,我正在尝试编写一个与py2.7-py3.7兼容的django redis序列化程序。 我正在使用django redis==4.8.0和django==1.11.22以及pickle序列化程序。我在django redis上看到了这个问题,并编写了一个类似于线程中所述内容的序列化程序。然而,我的目标似乎有点复杂?不确定 我的目标是让两个应用程序同时运行,一个使用py2.7,另一个使用py3.7。它们必须是100%兼容的,我无法克服这一点 以下是序列化程序的代码: #-*-编码:utf-8-*-

我正在尝试编写一个与py2.7-py3.7兼容的django redis序列化程序。 我正在使用
django redis==4.8.0
django==1.11.22
以及
pickle序列化程序。我在django redis上看到了这个问题,并编写了一个类似于线程中所述内容的序列化程序。然而,我的目标似乎有点复杂?不确定

我的目标是让两个应用程序同时运行,一个使用py2.7,另一个使用py3.7。它们必须是100%兼容的,我无法克服这一点

以下是序列化程序的代码:

#-*-编码:utf-8-*-
进口六
从django.utils.encoding导入强制字节
从django_redis.serializers.pickle导入pickle序列化程序
尝试:
作为腌菜进口cPickle
除恐怖外:
进口泡菜
类CompatPickleSerializer(PickleSerializer):
def加载(自身、值):
如果是6.PY3:
返回自我。加载\u py3(值)
返回super(序列化程序,self).load(强制字节(值))
def_加载_py3(自身,值):
返回pickle.load(
强制字节(值),
fix_imports=True,
编码class='bytes'
)
我尝试序列化的对象示例:

{
“创建时间”:datetime.datetime(2019,7,30,20,0,29,244916,tzinfo=),
“项目”:[{
“单价”:十进制('3.00'),
“名称”:“我的项目”,
“id”:“12312”,
}]
“id”:“b5c6210d-561f-4e4e-a025-e55b39d95418”,
“名称”:“购物车”,
“客户”:无,
}
这个物体比那个大很多,但我假设如果我可以用这个物体做流动,我可以用一个更大的

在python 3.7.2上尝试
加载
对象后,出现以下错误:

Traceback:  

File "my-project/lib/python3.7/site-packages/django_redis/client/default.py" in decode
  313.             value = int(value)


      During handling of the above exception (invalid literal for int() with base 10: b'\x80\x02}q\x01(U\tdiscountsq\x02NU\x10display_order_idq\x03NU\x12shipping_method_idq\x04NU\x0creservationsq\x05}U\ncreated_atq\x06U 2019-07-30T20:00:14.022071+00:00q\x07U\tpromocodeq\x08NU\x11shippi), another exception occurred:



File "my-project/lib/python3.7/site-packages/django/core/handlers/exception.py" in inner
  41.             response = get_response(request)

File "my-project/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "my-project/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "my-project/lib/python3.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
  58.         return view_func(*args, **kwargs)

File "my-project/lib/python3.7/site-packages/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)

File "my-project/lib/python3.7/site-packages/rest_framework/views.py" in dispatch
  489.             response = self.handle_exception(exc)

File "my-project/lib/python3.7/site-packages/rest_framework/views.py" in handle_exception
  449.             self.raise_uncaught_exception(exc)

File "my-project/lib/python3.7/site-packages/rest_framework/views.py" in dispatch
  486.             response = handler(request, *args, **kwargs)

File "django/cart/api/cart.py" in get
  98.         cart = Cart.get(cart_id)

File "django/cart/models/cart.py" in get
  1.190.             raise e

File "django/cart/models/cart.py" in get
  1.186.             data = cart_cache.get(id)

File "my-project/lib/python3.7/site-packages/django_redis/cache.py" in _decorator
  33.             return method(self, *args, **kwargs)

File "my-project/lib/python3.7/site-packages/django_redis/cache.py" in get
  82.                                    client=client)

File "my-project/lib/python3.7/site-packages/django_redis/client/default.py" in get
  208.         return self.decode(value)

File "my-project/lib/python3.7/site-packages/django_redis/client/default.py" in decode
  320.             value = self._serializer.loads(value)

File "django/backports/django_redis/serializers.py" in loads
  28.             return self._loads_py3(value)

File "django/backports/django_redis/serializers.py" in _loads_py3
  35.             encoding='bytes'

Exception Type: TypeError at /my-url/
Exception Value: conversion from bytes to Decimal is not supported

关于我能做什么有什么想法吗?

如果有人遇到这个问题,我会找到这个解决方案

#-*-编码:utf-8-*-
进口六
从django_redis.serializers.pickle导入pickle序列化程序,pickle
类CompatPickleSerializer(PickleSerializer):
def加载(自身、值):
如果是6.PY3:
返回自我。加载\u py3(值)
返回super(序列化程序,self).loads(值)
def_加载_py3(自身,值):
返回pickle.load(
价值
fix_imports=True,
编码='1'
)
我从
encoding='bytes'
改为
latin1
,效果很好。不需要强制执行_字节

另一件重要的事情是,您需要将
PICKLE\u版本
强制为2,否则,如果在python3上序列化数据,您将无法在python2.7上对其进行PICKLE

希望它能帮助任何人