[本文出自天外归云的博客园]
在使用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