Python FastAPI中的中间件,用于为每个请求生成UUID并发送到日志
我正在Fast API中寻找中间件,用于为每个请求生成UUID,并将其发送到日志Python FastAPI中的中间件,用于为每个请求生成UUID并发送到日志,python,python-3.x,logging,request,fastapi,Python,Python 3.x,Logging,Request,Fastapi,我正在Fast API中寻找中间件,用于为每个请求生成UUID,并将其发送到日志 # To see the logs, run this in python interpreter # import with_logger # with_logger.main() import uuid from logging import getLogger import logging.config from yaml import load, FullLoader from fastapi impor
# To see the logs, run this in python interpreter
# import with_logger
# with_logger.main()
import uuid
from logging import getLogger
import logging.config
from yaml import load, FullLoader
from fastapi import FastAPI
import uvicorn
app = FastAPI()
# @app.middleware("http")
@app.get("/")
def gen_uuid():
# For every get request generate uuid
global uuid_var
uuid_var = uuid.uuid4()
return uuid_var
log_dict = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': '%(uuid_var)s %(asctime)s %(levelname)-8s %(name)-15s %(message)s -Thread id: %(thread)d Thread name: %(threadName)s'
},
},
'handlers': {
'default': {
'level': 'INFO',
'formatter': 'standard',
'class': 'logging.StreamHandler',
},
'file_handler': {
'level': 'INFO',
'filename': 'mylogfile.log',
'class': 'logging.FileHandler',
'formatter': 'standard'
}
},
'loggers': {
'': {
'handlers': ['file_handler'],
'level': 'INFO',
'propagate': True
},
}
}
class ContextFilter(logging.Filter):
def filter(self, record):
record.uuid_var = gen_uuid()
return True
def main():
logging.config.dictConfig(log_dict)
handler = logging.StreamHandler()
handler.formatter = logging.Formatter(
"%(uuid_var)s %(asctime)s %(levelname)-8s %(name)-15s %(message)s -Thread id: %(thread)d Thread name: %(threadName)s")
handler.addFilter(ContextFilter())
logger = getLogger(__name__)
logger.addHandler(handler)
logger.warning(" This is a warning message")
uvicorn.run(app, host="127.0.0.1", port=8080)
我需要将uuid发送到X-Request-ID头,然后使用python日志库从那里获取uuid,如
@app.middleware("http")
async def get_x_request_id_header(*, x_request_id: str = Header(None)):
# return x-request-id header
return {"X-Request-ID": x_request_id}
我需要所有这些在一个中间件中。在FastAPI中是否存在这样的中间件
我需要在中间件内部生成uuid,如
@app.middleware("http")
def gen_uuid():
# For every get request generate uuid
global uuid_var
uuid_var = uuid.uuid4()
return uuid_var
但我不能这样做。我得到的错误类似于gen_uuid接受2个参数,但传递0个参数,中间件需要两个参数:request:request,call_next request是api请求,call_next是处理请求的实际调用 大概是这样的:
@app.middleware("http")
async def init_requestvars(request: fastapi.Request, call_next):
# Customize that SimpleNamespace with hatever you need
initial_g = types.SimpleNamespace()
requestvars.request_global.set(initial_g)
response = await call_next(request)
return response
欢迎来到SO。你能展示一下你到目前为止的想法并指出你正在努力的方向吗?谢谢。谢谢@jbndlr我现在已经写了详细的描述。