Halten Sie die Kontext -Vars -Werte zwischen Fastapi/Starlette Middlewares je nach Middleware -ReihenfolgePython

Python-Programme
Anonymous
 Halten Sie die Kontext -Vars -Werte zwischen Fastapi/Starlette Middlewares je nach Middleware -Reihenfolge

Post by Anonymous »

Ich entwickle eine Fastapi -App, und mein Ziel ist es, einige Informationen in einem Anforderungsbereich aufzunehmen und diese Informationen später in Protokolldatensätzen wiederzuverwenden. ist mein App-Skelett < /p>

Code: Select all

logger = logging.getLogger(__name__)
app = FastAPI()
app.add_middleware(SetterMiddlware)
app.add_middleware(FooMiddleware)

@app.get("/")
def read_root(setter = Depends(set_request_id)):
print("Adding req_id to body", req_id.get()) # This is 1234567890
logging.info("hello")
return {"Req_id": str(req_id.get())}
< /code>
Und das sind meine Middlewares < /p>
class SetterMiddlware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
calculated_id = "1234567890"
req_id.set(calculated_id)
request.state.req_id = calculated_id
response = await call_next(request)
return response

class FooMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
response = await call_next(request)
return response
< /code>
und der Protokollierungsfilter < /p>
from vars import req_id

class CustomFilter(Filter):
"""Logging filter to attach the user's authorization to log records"""

def filter(self, record: LogRecord) -> bool:

record.req_id = req_id.get()
return True
< /code>
Und schließlich einem Teil meiner Protokollkonfiguration < /p>
 folgt...
"formatters": {
"default": {
"format": "%(levelname)-9s %(asctime)s [%(req_id)s]| %(message)s",
"datefmt": "%Y-%m-%d,%H:%M:%S",
},
},
"handlers": {
...
"handlers": {
"console": {
"class": "logging.StreamHandler",
"formatter": "default",
"stream": "ext://sys.stderr",
"filters": [
"voxy_filter",
],
"level": logging.NOTSET,
},
...
"loggers": {
"": {
"handlers": ["console"],
"level": logging.DEBUG,
},
"uvicorn": {"handlers": ["console"], "propagate": False},
},
Wenn setDerDdlware der neueste in der App hinzugefügt ist (in der App (

Code: Select all

FooMiddleware
kommentiert im Beispiel), meine App protokolliert wie erwartet

Code: Select all

Adding req_id to body 1234567890
INFO      2025-04-14,15:02:28 [1234567890]| hello
INFO      2025-04-14,15:02:28 [1234567890]| 127.0.0.1:52912 - "GET / HTTP/1.1" 200
Aber wenn ich nach setDerDdlware andere Middleware hinzufüge, findet Uvicorn-Logger nicht mehr die context_var req_id set.

Code: Select all

Adding req_id to body 1234567890
INFO      2025-04-14,15:03:56 [1234567890]| hello
INFO      2025-04-14,15:03:56 [None]| 127.0.0.1:52919 - "GET / HTTP/1.1" 200
Ich habe versucht, das Paket https://starlette-context.readthedocs.io/en/latest/ zu verwenden, aber ich war kein Glück. Es sieht so aus, als würde es die gleichen Probleme haben.>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post