解决python-memcache报错:“Unknown flags on get: 20”

[本文出自天外归云的博客园]

在使用python的pytho-memcache库时出现了一个问题,在调用get方法获取键值的时候报错:Unknown flags on get: 20

在网上查了,发现一个人也遇到了同样的问题但没解决:Python 'Unknown flags on get' error while querying memcached

通过排查源码逻辑,我发现并不是获取不到key的value,而是源码中对flags的相关处理逻辑导致没有返回memcache服务器的返回值。

通过调试源码,定位问题出在memcache.py文件 > _recv_value方法 > 最后的else分支 只抛出了异常而没有指定返回值val导致,修改方法如下:

def _recv_value(self, server, flags, rlen):
    rlen += 2  # include 

    buf = server.recv(rlen)
    if len(buf) != rlen:
        raise _Error("received %d bytes when expecting %d"
                     % (len(buf), rlen))

    if len(buf) == rlen:
        buf = buf[:-2]  # strip 


    if flags & Client._FLAG_COMPRESSED:
        buf = self.decompressor(buf)
        flags &= ~Client._FLAG_COMPRESSED
    if flags == 0:
        # Bare bytes
        val = buf
    elif flags & Client._FLAG_TEXT:
        val = buf.decode('utf-8')
    elif flags & Client._FLAG_INTEGER:
        val = int(buf)
    elif flags & Client._FLAG_LONG:
        if six.PY3:
            val = int(buf)
        else:
            val = long(buf)  # noqa: F821
    elif flags & Client._FLAG_PICKLE:
        try:
            file = BytesIO(buf)
            unpickler = self.unpickler(file)
            if self.persistent_load:
                unpickler.persistent_load = self.persistent_load
            val = unpickler.load()
        except Exception as e:
            self.debuglog('Pickle error: %s
' % e)
            return None
    else:
        self.debuglog("unknown flags on get: %x
" % flags)
        # 注释掉这行
        # raise ValueError('Unknown flags on get: %x' % flags)
        # 设定返回值
        val = buf

    return val

问题就这样解决了。

相关问题:https://github.com/linsomniac/python-memcached/issues/144

原文地址:https://www.cnblogs.com/LanTianYou/p/9204431.html