1
- # app/exception_handlers/base.py
2
1
import orjson
3
2
from fastapi import Request
4
- from fastapi .responses import JSONResponse
5
3
from rotoger import AppStructLogger
4
+ from attrs import define , field
5
+
6
6
7
7
logger = AppStructLogger ().get_logger ()
8
8
9
9
10
+ @define (slots = True )
11
+ class RequestInfo :
12
+ """Contains extracted request information."""
13
+ path : str = field ()
14
+ body : dict = field (default = None )
15
+
16
+
17
+ @define (slots = True )
10
18
class BaseExceptionHandler :
11
19
"""Base class for all exception handlers with common functionality."""
12
20
13
21
@staticmethod
14
- async def extract_request_info (request : Request ):
22
+ async def extract_request_info (request : Request ) -> RequestInfo :
15
23
"""Extract common request information."""
16
24
request_path = request .url .path
25
+ request_body = None
17
26
try :
18
27
raw_body = await request .body ()
19
- request_body = orjson .loads (raw_body ) if raw_body else None
28
+ if raw_body :
29
+ request_body = orjson .loads (raw_body )
20
30
except orjson .JSONDecodeError :
21
- request_body = None
31
+ pass
22
32
23
- return request_path , request_body
33
+ return RequestInfo ( path = request_path , body = request_body )
24
34
25
35
@classmethod
26
- async def log_error (cls , message , request_info , ** kwargs ):
36
+ async def log_error (cls , message : str , request_info : RequestInfo , ** kwargs ):
27
37
"""Log error with standardized format."""
28
- request_path , request_body = request_info
29
38
await logger .aerror (
30
39
message ,
31
- request_url = request_path ,
32
- request_body = request_body ,
40
+ request_url = request_info . path ,
41
+ request_body = request_info . body ,
33
42
** kwargs
34
43
)
0 commit comments