"""
演示 mode="before" 中 data 参数的内容和返回值要求
"""
import typing as _t
from pydantic import BaseModel, model_validator
class DescribeWorkflowRequest(BaseModel):
session_id: str
dsl_data: _t.Optional[str] = None
dsl_path: _t.Optional[str] = None
@model_validator(mode="before")
@classmethod
def validate_dsl_source(cls, data):
"""演示 data 的内容和必须返回字典"""
print("\n" + "="*50)
print("【mode='before' 验证器执行】")
print("="*50)
print(f"data 的类型: {type(data)}")
print(f"data 的内容: {data}")
print(f"data 是否为字典: {isinstance(data, dict)}")
# 如果 data 是字典,可以访问和修改
if isinstance(data, dict):
print("\n可以访问字典的键:")
for key in data.keys():
print(f" - {key}: {data[key]}")
# 可以修改字典
if "dsl_data" in data and data["dsl_data"]:
data["dsl_data"] = data["dsl_data"].strip() # 去除空白
# 可以添加新字段
data["_processed"] = True
print("\n返回修改后的字典...")
print("="*50 + "\n")
# ⚠️ 必须返回字典!
if isinstance(data, dict):
return data
else:
# 如果不是字典,需要转换为字典
return dict(data) if hasattr(data, '__dict__') else {}
============================================================================
测试不同的输入场景
============================================================================
print("测试1: 从字典创建")
print("-" * 50)
request1 = DescribeWorkflowRequest(
session_id="abc123",
dsl_data=" some data ",
dsl_path=None
)
print(f"最终结果: {request1.model_dump()}")
print("\n测试2: 从字典创建(缺少字段)")
print("-" * 50)
try:
request2 = DescribeWorkflowRequest(
session_id="abc123"
缺少 dsl_data 和 dsl_path
)
print(f"最终结果: {request2.model_dump()}")
except Exception as e:
print(f"错误: {e}")
print("\n测试3: 从 JSON 字符串创建(模拟 API 请求)")
print("-" * 50)
import json
json_data = json.loads('{"session_id": "xyz789", "dsl_path": "/path/to/file.json"}')
request3 = DescribeWorkflowRequest(**json_data)
print(f"最终结果: {request3.model_dump()}")