# -*- coding: utf-8 -*- from __future__ import absolute_import, unicode_literals import json import random import string import json import six from utils.storage import BaseStorage def to_text(value, encoding='utf-8'): """Convert value to unicode, default encoding is utf-8 :param value: Value to be converted :param encoding: Desired encoding """ if not value: return '' if isinstance(value, six.text_type): return value if isinstance(value, six.binary_type): return value.decode(encoding) return six.text_type(value) def to_binary(value, encoding='utf-8'): """Convert value to binary string, default encoding is utf-8 :param value: Value to be converted :param encoding: Desired encoding """ if not value: return b'' if isinstance(value, six.binary_type): return value if isinstance(value, six.text_type): return value.encode(encoding) return to_text(value).encode(encoding) def random_string(length=16): rule = string.ascii_letters + string.digits rand_list = random.sample(rule, length) return ''.join(rand_list) def byte2int(c): if six.PY2: return ord(c) return c class KvStorage(BaseStorage): def __init__(self, kvdb, prefix='client'): for method_name in ('get', 'set', 'delete'): assert hasattr(kvdb, method_name) self.kvdb = kvdb self.prefix = prefix def key_name(self, key): return '{0}:{1}'.format(self.prefix, key) def get(self, key, default=None): key = self.key_name(key) value = self.kvdb.get(key) if value is None: return default return json.loads(to_text(value)) def set(self, key, value, ttl=None): if value is None: return key = self.key_name(key) value = json.dumps(value) self.kvdb.set(key, value, ttl) def delete(self, key): key = self.key_name(key) self.kvdb.delete(key)