500 handle
This commit is contained in:
+16
-15
@@ -6,6 +6,7 @@ from typing import cast
|
|||||||
|
|
||||||
import aiofiles
|
import aiofiles
|
||||||
from fastapi import Request
|
from fastapi import Request
|
||||||
|
from fastapi.responses import JSONResponse
|
||||||
from starlette.concurrency import iterate_in_threadpool
|
from starlette.concurrency import iterate_in_threadpool
|
||||||
from starlette.middleware.base import BaseHTTPMiddleware
|
from starlette.middleware.base import BaseHTTPMiddleware
|
||||||
from starlette.responses import Response, StreamingResponse
|
from starlette.responses import Response, StreamingResponse
|
||||||
@@ -23,32 +24,32 @@ class ProcessingTimeMiddleware(BaseHTTPMiddleware):
|
|||||||
class LoggingMiddleware(BaseHTTPMiddleware):
|
class LoggingMiddleware(BaseHTTPMiddleware):
|
||||||
async def dispatch(self, request: Request, call_next) -> Response:
|
async def dispatch(self, request: Request, call_next) -> Response:
|
||||||
current_time = strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
|
current_time = strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
|
||||||
file_time=strftime("%b_%Y", gmtime())
|
file_time = strftime("%b_%Y", gmtime())
|
||||||
response = await call_next(request)
|
client_ip = request.headers.get('x-forwarded-for', '').split(',')[0].strip() or (request.client.host if request.client else 'unknown')
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = await call_next(request)
|
||||||
|
except Exception as exc: # noqa: BLE001
|
||||||
|
body = str(exc)
|
||||||
|
async with aiofiles.open(f"./logs/endpoints_log_{file_time}.txt", "a") as file:
|
||||||
|
await file.write(f"[{current_time}] [500] [{body}] [{client_ip}]\n")
|
||||||
|
return JSONResponse(status_code=500, content={"detail": "Internal Server Error"})
|
||||||
|
|
||||||
streaming_response = cast(StreamingResponse, response)
|
streaming_response = cast(StreamingResponse, response)
|
||||||
|
|
||||||
chunks = []
|
chunks = []
|
||||||
async for chunk in streaming_response.body_iterator:
|
async for chunk in streaming_response.body_iterator:
|
||||||
if isinstance(chunk, str):
|
chunks.append(chunk.encode() if isinstance(chunk, str) else bytes(chunk))
|
||||||
chunks.append(chunk.encode())
|
|
||||||
else:
|
|
||||||
chunks.append(bytes(chunk))
|
|
||||||
|
|
||||||
body_bytes = b"".join(chunks)
|
body_bytes = b"".join(chunks)
|
||||||
streaming_response.body_iterator = iterate_in_threadpool(iter([body_bytes]))
|
streaming_response.body_iterator = iterate_in_threadpool(iter([body_bytes]))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
body = json.loads(body_bytes)
|
parsed = json.loads(body_bytes)
|
||||||
if not isinstance(body, bool):
|
body = parsed.get("detail", None) if not isinstance(parsed, bool) else None
|
||||||
body=body.get("detail", None)
|
|
||||||
else:
|
|
||||||
body=None
|
|
||||||
|
|
||||||
except (json.JSONDecodeError, TypeError):
|
except (json.JSONDecodeError, TypeError):
|
||||||
body = None
|
body = None
|
||||||
|
|
||||||
client_ip = request.headers.get('x-forwarded-for', '').split(',')[0].strip() or (request.client.host if request.client else 'unknown')
|
|
||||||
|
|
||||||
async with aiofiles.open(f"./logs/endpoints_log_{file_time}.txt", "a") as file:
|
async with aiofiles.open(f"./logs/endpoints_log_{file_time}.txt", "a") as file:
|
||||||
await file.write(f"[{current_time}] [{response.status_code}] [{body}] [{client_ip}]\n")
|
await file.write(f"[{current_time}] [{response.status_code}] [{body}] [{client_ip}]\n")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user