Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7和3.8.0兼容的django redis序列化程序_Python_Django_Python 3.x - Fatal编程技术网

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

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

我有两台服务器在运行,一台运行在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的两个版本到普通的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(值),这就是引发错误的原因。