92 lines
2.0 KiB
Python
92 lines
2.0 KiB
Python
"""
|
|
响应格式化中间件
|
|
|
|
自动将 API 响应中的字符串或错误信息格式化为统一风格
|
|
"""
|
|
|
|
from starlette.middleware.base import BaseHTTPMiddleware
|
|
from starlette.requests import Request
|
|
from starlette.responses import JSONResponse
|
|
from typing import Callable
|
|
|
|
from backend.app.core import get_formatter
|
|
|
|
|
|
class ResponseFormatterMiddleware(BaseHTTPMiddleware):
|
|
"""
|
|
响应格式化中间件
|
|
|
|
功能:
|
|
1. 统一响应包装
|
|
2. 错误信息格式化
|
|
3. 调试信息注入(可选)
|
|
"""
|
|
|
|
async def dispatch(self, request: Request, call_next: Callable):
|
|
response = await call_next(request)
|
|
return response
|
|
|
|
|
|
def format_error_response(
|
|
error_type: str,
|
|
error_message: str,
|
|
suggestions: list = None,
|
|
retry_count: int = 0,
|
|
max_retries: int = None
|
|
) -> str:
|
|
"""
|
|
格式化错误响应
|
|
|
|
Args:
|
|
error_type: 错误类型
|
|
error_message: 错误详情
|
|
suggestions: 建议操作列表
|
|
retry_count: 已重试次数
|
|
max_retries: 最大重试次数
|
|
|
|
Returns:
|
|
格式化后的 Markdown 文本
|
|
"""
|
|
formatter = get_formatter()
|
|
return formatter.render_error(
|
|
error_type=error_type,
|
|
error_message=error_message,
|
|
suggestions=suggestions,
|
|
retry_count=retry_count,
|
|
max_retries=max_retries
|
|
)
|
|
|
|
|
|
def format_success_response(
|
|
content: str,
|
|
title: str = None,
|
|
include_footer: bool = True
|
|
) -> str:
|
|
"""
|
|
格式化成功响应
|
|
|
|
Args:
|
|
content: 内容
|
|
title: 可选标题
|
|
include_footer: 是否包含页脚
|
|
|
|
Returns:
|
|
格式化后的 Markdown 文本
|
|
"""
|
|
formatter = get_formatter()
|
|
md = formatter.md
|
|
|
|
lines = []
|
|
if title:
|
|
lines.append(md.heading(title, 2))
|
|
lines.append("")
|
|
|
|
lines.append(content)
|
|
|
|
if include_footer:
|
|
lines.append("")
|
|
lines.append("---")
|
|
lines.append("*以上内容由 AI Agent 生成*")
|
|
|
|
return "\n".join(lines)
|