import hashlib from copy import deepcopy from settings import settings __all__ = 'restore_field', 'sort_kv', 'check_sign', 'check_preset' def restore_field(data: dict) -> tuple: res = dict() sign_kv = dict() for k, v in data.items(): key = settings.FIELD_MAP.get(k) or k if isinstance(v, dict): res[key], sign_kv[key] = restore_field(v) else: res[key] = v if isinstance(v, list): for i, item in enumerate(v): if isinstance(item, dict) or isinstance(item, list): raise ValueError(f'请检查字段:{key} 数据类型,值:{v}') if isinstance(item, bool): v[i] = str(item).lower() elif item is None: v[i] = '' sign_kv[key] = ','.join(map(lambda x: str(x), v)) elif isinstance(v, bool): sign_kv[key] = str(v).lower() res[key] = int(v) elif v is None: sign_kv[key] = 'null' res[key] = '' else: sign_kv[key] = v return res, sign_kv def check_preset(data: dict): preset_name = set(settings.FIELD_MAP.values()) illegality_name = dict() for k, v in data.items(): if k.startswith('#') and k not in preset_name: illegality_name[k] = v for k, v in illegality_name.items(): del data[k] data[k[1:]] = v return data # def restore_field(data: dict) -> dict: # """ # 不在预置字段 去掉前置# # :param data: # :return: # """ # res = dict() # for k, v in data.items(): # map_name = settings.FIELD_MAP.get(k) # if map_name: # res[map_name] = v # elif k.startswith('#'): # res[k[1:]] = v # else: # res[k] = v # return res def sort_kv(*args: dict): return '&'.join(map(lambda item: '&'.join(map(lambda x: f'{x[0]}={x[1]}', sorted(item.items()))), args)) def check_sign(sign: str, salt: str, *args: dict): s = sort_kv(*args) + salt if hashlib.md5(s.encode()).hexdigest() != sign: return False return True