validation_utils.py 1.3 KB

123456789101112131415161718192021222324252627
  1. from jsonschema import validate, ValidationError
  2. from app.core.biz_exception import NotFoundError, PermissionDeniedError, BizLogicError
  3. from jsonschema import validate, ValidationError
  4. def validate_user_inputs(schema_json: dict, user_inputs: dict):
  5. try:
  6. validate(instance=user_inputs, schema=schema_json)
  7. except ValidationError as e:
  8. # 1. 获取报错字段的路径 (例如: "user.phone")
  9. field = ".".join(map(str, e.path)) if e.path else "root"
  10. # 2. 优先尝试从 Schema 定义中获取人类可读的 'description' 或 'title'
  11. # e.schema 是当前校验失败的那个具体字段的 schema 定义片段
  12. custom_msg = e.schema.get("description") or e.schema.get("title")
  13. # 3. 构建错误信息
  14. if e.validator == 'pattern':
  15. # 如果是正则错误 (pattern),且我们定义了 description,就用 description
  16. # 如果没定义,就给一个通用的 "格式不正确"
  17. reason = custom_msg if custom_msg else "format is invalid"
  18. else:
  19. # 其他类型的错误(如类型不对、必填项缺失),保留原报错或也尝试用 description
  20. reason = custom_msg if custom_msg else e.message
  21. # 4. 抛出最终的人话提示
  22. raise BizLogicError(f"Invalid parameter [{field}]: {reason}")