Возможно, это не очень эффективное решение, но вы можете сохранить его в пространстве потока.
Я использовал это для добавления уникального идентификатора - request_id
к каждому запросу и добавления его в формат регистратора. , Таким образом, мне не нужно было передавать request_id
каждой функции.
init.py для моего промежуточного ПО:
import threading
local = threading.local()
Это было мое специальное промежуточное ПО:
import json
import uuid
import traceback
from django.utils.deprecation import MiddlewareMixin
class RequestIDMiddleware(MiddlewareMixin):
def process_request(self, request):
de_run_id = str(uuid.uuid4())
local.de_run_id = de_run_id
request.de_run_id = de_run_id
if request.body:
try:
req = json.loads(request.body)
if req.get("app_id"):
local.app_id = req["app_id"]
elif req.get("APP_DATA", {}).get("metadata", {}).get("app_id"):
local.app_id = req["APP_DATA"]["metadata"]["app_id"]
else:
local.app_id = None
except Exception, e:
local.app_id = None
else:
local.app_id = None
И это был мой пользовательский фильтр логов:
import logging
from xxxx.middleware import local
class RequestIDFilter(logging.Filter):
def filter(self, record):
record.de_run_id = getattr(local, 'de_run_id')
record.app_id = getattr(local, "app_id")
return True
вы можете определить local в init.py вашего проекта. а затем перезаписать его с помощью промежуточного программного обеспечения (или того, что вам подходит) и получить доступ к local
на протяжении всего проекта.
Является ли это лучшим решением для вас, зависит от множества факторов, обсуждаемых здесь