from starlette.middleware.base import BaseHTTPMiddleware

from fastapi import Request

import json

from fastapi.responses import JSONResponse,StreamingResponse

import traceback

class ResponseMiddleware(BaseHTTPMiddleware):

    async def dispatch(self,request:Request,call_next):

        try:

            response=await call_next(request)

            if response.status_code==200:

                 # 处理流式响应

                 body = b"".join([chunk async for chunk in response.body_iterator])

                 response.body_iterator = iter([body])  # 重置迭代器

                 try:

                    body_data = json.loads(body.decode()) if body else None

                 except json.JSONDecodeError:

                    body_data = body.decode()  # 非JSON则保留原始数据

                 return JSONResponse({

                    "code":200,

                    "data":body_data,

                    "message":"success"

                })

            return response

        except Exception as e:

            return JSONResponse({

                    "code":500,

                    "data":None,

                    "message":traceback.format_exception(e) @跟踪错误信息

            },status_code=500)


 

使用 方法

#main.py

from app.utils.responseMiddlerWare import ResponseMiddleware

app=FASTAPI()

app.addmiddleware(ResponseMiddleware)

如果想过滤掉其中的某个路径信息,可以这样写

import os

def fitler_trackback(exc:BaseException):

    tb=exc.__traceback__

    while tb:

        frame=tb.tb_frame

        # 检查文件名或模块路径是否含中间件特征

        frame_file = os.path.abspath(frame.f_code.co_filename).lower()

        is_middleware = (

            'middleware' in frame_file or

             '/middlewares/' in frame_file or

             'starlette' in frame_file or

            frame.f_code.co_name == 'dispatch'  # 常见中间件入口方法

        )

        if not is_middleware:

           break

        tb=tb.tb_next

    return traceback.format_exception(type(exc),exc,tb)

 引用

from starlette.middleware.base import BaseHTTPMiddleware

from fastapi import Request

import json

from fastapi.responses import JSONResponse,StreamingResponse

import traceback

class ResponseMiddleware(BaseHTTPMiddleware):

    async def dispatch(self,request:Request,call_next):

        try:

            response=await call_next(request)

            if response.status_code==200:

                 # 处理流式响应

                 body = b"".join([chunk async for chunk in response.body_iterator])

                 response.body_iterator = iter([body])  # 重置迭代器

                 try:

                    body_data = json.loads(body.decode()) if body else None

                 except json.JSONDecodeError:

                    body_data = body.decode()  # 非JSON则保留原始数据

                 return JSONResponse({

                    "code":200,

                    "data":body_data,

                    "message":"success"

                })

            return response

        except Exception as e:

            return JSONResponse({

                    "code":500,

                    "data":None,

                    "message":fitler_trackback(e) @跟踪错误信息

            },status_code=500)

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐