|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- import json
- import time
- from fastapi import FastAPI, Request,HTTPException
- from starlette.middleware.base import BaseHTTPMiddleware
- from starlette.responses import JSONResponse
- from pydantic import BaseModel
- from datetime import datetime
- import logging
-
-
- from common.log import logger
-
-
-
-
- class Result(BaseModel):
- code: int
- message: str
- status: str
-
- class ResponseData(BaseModel):
- data: dict|list|None
- result: Result
- timestamp: str
-
-
-
-
- async def http_context(request: Request, call_next):
-
- request_info = {
- "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
- "method": request.method,
- "url": str(request.url),
- "body": await request.body() if request.method in ["POST", "PUT", "PATCH"] else None,
- }
- logger.info(f"请求: {json.dumps(request_info, separators=(',', ':'), default=str, ensure_ascii=False)}")
-
-
- response = await call_next(request)
-
-
- if response.status_code == 200:
- try:
- response_body = b""
- async for chunk in response.body_iterator:
- response_body += chunk
- response_body_str = response_body.decode("utf-8")
- business_data = json.loads(response_body_str)
- except Exception as e:
- business_data = {"error": f"Unable to decode response body: {str(e)}"}
-
- if "code" in business_data:
- message=business_data.get("message","请求失败!")
- result = ResponseData(
- data=None,
- result=Result(code=business_data.get("code",500), message=message, status="failed"),
- timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
- )
- else:
-
- result = ResponseData(
- data=business_data,
- result=Result(code=200, message="请求成功!", status="succeed"),
- timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
- )
- response_info = {
- "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
- "status_code": response.status_code,
- "headers": dict(response.headers),
- "body": result.dict(),
- }
- logger.info(f"响应: {json.dumps(response_info, separators=(',', ':'), default=str, ensure_ascii=False)}")
-
-
- return JSONResponse(content=result.model_dump())
-
- else:
- print(response)
- print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
- message = "请求失败!"
-
- try:
- response_body = b""
- async for chunk in response.body_iterator:
- response_body += chunk
- response_body_str = response_body.decode("utf-8")
- business_data = json.loads(response_body_str)
- except Exception as e:
- business_data = {"error": f"Unable to decode response body: {str(e)}"}
-
-
- if response.status_code == 404:
- message = e.detail
- elif response.status_code == 400:
- message = "请求参数错误"
- elif response.status_code == 500:
- message = "服务器内部错误"
-
-
-
-
-
- result = ResponseData(
- data={},
- result=Result(
- code=response.status_code,
- message=message,
- status="failed"
- ),
- timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
- )
- response_info = {
- "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
- "status_code": response.status_code,
- "headers": dict(response.headers),
- "body": result.dict(),
- }
- logger.info(f"响应: {json.dumps(response_info, separators=(',', ':'), default=str, ensure_ascii=False)}")
-
-
- return JSONResponse(content=result.model_dump(), status_code=response.status_code)
-
- async def http_context_2(request: Request, call_next):
-
- request_body = None
- if request.method in ["POST", "PUT", "PATCH"]:
- try:
- request_body = await request.json()
- except Exception:
- request_body = "无法解析 JSON"
-
- request_info = {
- "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
- "method": request.method,
- "url": str(request.url),
- "body": request_body,
- }
- logger.info(f"请求: {json.dumps(request_info, separators=(',', ':'), ensure_ascii=False)}")
-
-
- response = await call_next(request)
-
-
- if response.status_code == 422:
- return response
-
-
- try:
- response_body = b""
- async for chunk in response.body_iterator:
- response_body += chunk
- response_body_str = response_body.decode("utf-8")
- business_data = json.loads(response_body_str)
- except Exception as e:
- business_data = {"error": f"无法解析响应体: {str(e)}"}
-
- if "code" in business_data:
- message = business_data.get("message", "请求失败!")
- result = ResponseData(
- data=None,
- result=Result(code=business_data.get("code", 500), message=message, status="failed"),
- timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
- )
- else:
- result = ResponseData(
- data=business_data,
- result=Result(code=200, message="请求成功!", status="succeed"),
- timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
- )
-
- response_info = {
- "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
- "status_code": response.status_code,
- "headers": dict(response.headers),
- "body": result.dict(),
- }
- logger.info(f"响应: {json.dumps(response_info, separators=(',', ':'), ensure_ascii=False)}")
-
- return JSONResponse(content=result.model_dump())
|