__init__.py 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import re
  2. def is_number(character: str):
  3. """
  4. 判断是否为数字
  5. """
  6. return bool(re.match(r'^[-+]?\d+(\.\d+)?$', character)) if character else False
  7. def check_new_parameter(check_v, key, value):
  8. """
  9. 请求前对数据进行校验
  10. params: check_v: 一个list [type,(limit_condition)]
  11. type 表示 value 应该用什么类型
  12. limit_condition 就是检验的条件,可以不存在,如果是list则表示为其中一个,tuple则表示在此范围内
  13. key: 是指被检查的参数的名称用以打印日志及返回报错
  14. value: 是现在key所对应的具体的值,也是被用来被检查的值
  15. return: None or error_msg
  16. example:
  17. [str, "name", (1, 64)] 表示 name应是字符串类型, 长度应大于等于1小于等于64
  18. [list, "sex", [0, 1,...] 表示 sex应是列表,且值应该存在于list[0, 1]中
  19. [int, "year", (1, 200)] 表示 year应是整数类型, 数值应大于等于1小于等于200
  20. """
  21. if check_v[0] == int:
  22. if is_number(str(value)):
  23. value = int(value)
  24. if not isinstance(value, check_v[0]):
  25. return "type error, %s should be %s, but now is %s" % (key, str(check_v[0]), value)
  26. if len(check_v) == 2:
  27. if check_v[0] == str:
  28. if isinstance(check_v[1], list):
  29. if value not in check_v[1]:
  30. return "Invalid param, %s is %s now, not in %s" % (key, value, str(check_v[1]))
  31. if isinstance(check_v[1], tuple):
  32. if len(value) < check_v[1][0] or len(value) > check_v[1][1]:
  33. return "Invalid param, %s is %s now, length is %s, range from %s to %s" % (key, value, len(value),
  34. check_v[0], check_v[1])
  35. if check_v[0] == int:
  36. if isinstance(check_v[1], list):
  37. if value not in check_v[1]:
  38. return "Invalid param, %s is %s now, not in %s" % (key, value, str(check_v[1]))
  39. if isinstance(check_v[1], tuple):
  40. if value < check_v[1][0] or value > check_v[1][1]:
  41. return "Invalid param, %s is %s now, range from %s to %s" % (key, value, check_v[0], check_v[1])
  42. if check_v[0] == list:
  43. if isinstance(check_v[1], list):
  44. for v in value:
  45. if v not in check_v[1]:
  46. return "Invalid param, %s is %s now, not in %s" % (key, v, str(check_v[1]))
  47. class CheckParams:
  48. """
  49. 检验参数
  50. """
  51. def __init__(self, request_body, params_dict, logger, logger_name=None):
  52. self.request_body = request_body
  53. self.params_dict = params_dict
  54. self.logger_name = logger_name
  55. self.res = {
  56. "code": 0,
  57. "message": "ok",
  58. "data": {"operate_id": ""}
  59. }
  60. self.logger = logger
  61. self.body = dict()
  62. def start(self):
  63. """
  64. 开始校验
  65. :return:
  66. """
  67. for k, v in self.params_dict.items():
  68. if k not in self.request_body:
  69. if v[0] is True:
  70. message = f"Invalid Access, {self.logger_name} %s is not Found in request" % k
  71. self.logger.error(message)
  72. self.res["message"] = message
  73. self.res["code"] = 400
  74. return False, self.res
  75. else:
  76. continue
  77. check_result = check_new_parameter(v[1:], k, self.request_body[k])
  78. if check_result is None:
  79. self.body[k] = self.request_body[k]
  80. else:
  81. message = f"Invalid Access, {self.logger_name} " + check_result
  82. self.logger.error(message)
  83. self.res["message"] = message
  84. self.res["code"] = 400
  85. return False, self.res
  86. return True, self.body