template_resolver.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. # core/utils/template_resolver.py
  2. import re
  3. from typing import Any, Dict
  4. PLACEHOLDER_PATTERN = re.compile(r"\{\{\s*([a-zA-Z0-9_.]+)(\|[^}]+)?\s*\}\}")
  5. def resolve_request_body_template(
  6. data: Any,
  7. variables: Dict[str, Any],
  8. ) -> Any:
  9. """
  10. 仅解析请求参数中 {{var}} 模板
  11. Args:
  12. data: dict/list/str
  13. variables: {"next_cursor": "123", ...}
  14. Returns:
  15. 替换后的结构
  16. """
  17. if isinstance(data, dict):
  18. return {k: resolve_request_body_template(v, variables) for k, v in data.items()}
  19. elif isinstance(data, list):
  20. return [resolve_request_body_template(item, variables) for item in data]
  21. elif isinstance(data, str):
  22. def replacer(match):
  23. var_name = match.group(1)
  24. default_value = match.group(2)[1:] if match.group(2) else None
  25. value = variables.get(var_name)
  26. if value is not None:
  27. return str(value)
  28. elif default_value is not None:
  29. return default_value
  30. else:
  31. return ""
  32. return PLACEHOLDER_PATTERN.sub(replacer, data)
  33. else:
  34. return data
  35. if __name__ == '__main__':
  36. data = {
  37. "cursor": "{{next_cursor}}",
  38. "page_size": 20,
  39. "filters": {
  40. "start_date": "{{start_date}}",
  41. "end_date": "{{end_date|2025-01-01}}"
  42. },
  43. "tags": ["{{tag1}}", "{{tag2|default_tag}}"]
  44. }
  45. variables = {
  46. "next_cursor":"1",
  47. "start_date": "2025-06-30",
  48. "tag1": "news"
  49. }
  50. result = resolve_request_body_template(data, variables)
  51. print(result)