Python 2.7和3.8.0兼容的django redis序列化程序
我有两台服务器在运行,一台运行在python2.7上,另一台运行在python3.8上 对于这两个服务器,我们都有通用的Django缓存服务器 python2.7服务器正在Django缓存中设置缓存,python3.8试图读取该缓存时抛出一个错误 文件“/usr/local/bin/python-3.8.0/lib/python3.8/site packages/django_redis/serializers/pickle.py”,第35行,加载 返回pickle.load(值) UnicodeDecodeError:“ascii”编解码器无法对位置1中的字节0xe5进行解码:序号不在范围内(128) 我已经用同样的问题阅读了下面的帖子Python 2.7和3.8.0兼容的django redis序列化程序,python,django,python-3.x,Python,Django,Python 3.x,我有两台服务器在运行,一台运行在python2.7上,另一台运行在python3.8上 对于这两个服务器,我们都有通用的Django缓存服务器 python2.7服务器正在Django缓存中设置缓存,python3.8试图读取该缓存时抛出一个错误 文件“/usr/local/bin/python-3.8.0/lib/python3.8/site packages/django_redis/serializers/pickle.py”,第35行,加载 返回pickle.load(值) Unicod
我的目标是能够读取和从Python的两个版本到普通的Django缓存。< <默认>代码> STR <代码> >编码> Python 2.7 <代码>是代码> ASCII 。默认为3。x是代码> UTF-8/CODE >,所以您需要考虑这一点。p> 如果仔细观察,这不是Redis问题,而是编码问题,因此会显示错误消息: UnicodeDecodeError:“ascii”编解码器无法解码字节 要解决此问题,必须在python 2.7程序中将默认编码设置为
utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
这里有关于python编码转换问题的更多细节:对我有效的解决方案是我们在redis_缓存配置中实现了一个自定义序列化器和加法器
导入六个
从django.utils.encoding导入强制字节
从django_redis.serializers.pickle导入pickle序列化程序
尝试:
作为腌菜进口cPickle
除恐怖外:
进口泡菜
类CcustomPickleSerializer(PickleSerializer):
def加载(自身、值):
如果是6.PY3:
返回自我。加载\u py3(值)
返回super().加载(强制字节(值))
def_加载_py3(自身,值):
返回pickle.load(
强制字节(值),
fix_imports=True,
编码='1'
)
如果使用的编码方法为“字节”
。你可以得到字节,否则你会得到一个字符串
以及settings.py
中的缓存配置
中的以下行
'SERIALIZER':'file.location.CustomPickleSerializer'
中的
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/0',
'OPTIONS': {
'KEY_PREFIX': 'personify',
'SERIALIZER':'file.location.CustomPickleSerializer',
'PARSER_CLASS': 'redis.connection.HiredisParser', # Hiredis is WAY faster than redis-py
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
'CONNECTION_POOL_KWARGS': {
'max_connections': 100
},
'PICKLE_VERSION': 2, # Make sure we're using v2 of pickle, which is pretty efficient.
'SOCKET_CONNECT_TIMEOUT': 5, # Seconds (timeout for the connection to be established).
'SOCKET_TIMEOUT': 5, # Seconds (timeout for read and write operations after the connection is established).
'IGNORE_EXCEPTIONS': False # Set to True to act like memcached - i.e. don't raise errors.
}
}
}
当从缓存本身读取时,它作为字节非ASCII字符读取,并将格式检查为int(值),这就是引发错误的原因。