FastAPI 如何在 Python FastAPI 中记录原始的HTTP请求/响应
在本文中,我们将介绍如何在 Python FastAPI 中记录原始的HTTP请求和响应。FastAPI 是一个现代、高性能的Python web框架,它基于标准的Python类型提示进行强类型验证,并提供了自动生成交互式API文档的功能。
在开发Web应用程序时,了解每个请求的详细信息对于调试和监控非常重要。FastAPI提供了一种简单而强大的方法来记录原始的HTTP请求和响应,以便我们可以获得请求和响应的所有细节,包括请求方法、URL路径、请求头、请求体、响应状态码和响应内容。
阅读更多:FastAPI 教程
1. 使用FastAPI内置的Middleware
FastAPI提供了内置的Middleware——RequestResponseMiddleware,它可以用来拦截请求和响应,并记录原始的HTTP请求和响应。下面是一个示例:
from fastapi import FastAPI
from fastapi.middleware.gzip import GZipMiddleware
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware
from fastapi.middleware.trustedhost import TrustedHostMiddleware
from fastapi.middleware.cors import CORSMiddleware
from fastapi.middleware.wsgi import WSGIMiddleware
app = FastAPI()
@app.middleware("http")
async def log_request(request: Request, call_next):
# 记录请求的细节
logger.debug(f'Request: {request.method} {request.url.path}')
# 记录请求的原始内容
request_body = await request.body()
logger.debug(f'Request body: {request_body.decode()}')
response = await call_next(request)
# 记录响应的细节
logger.debug(f'Response: {response.status_code}')
# 记录响应的原始内容
response_body = await response.body()
logger.debug(f'Response body: {response_body.decode()}')
return response
上述示例中,我们使用app.middleware装饰器将log_request函数注册为FastAPI的中间件。在log_request函数中,我们可以通过request获取原始的HTTP请求细节,并通过response获取原始的HTTP响应细节。我们可以在这两个位置添加我们自己的日志记录逻辑,以满足我们的需求。
2. 自定义日志格式
FastAPI使用标准的Python日志模块logging,我们可以根据自己的需求自定义日志记录格式。下面是一个示例:
import logging
logger = logging.getLogger("uvicorn.error")
# 创建自定义的日志处理器和格式
class CustomHandler(logging.StreamHandler):
def emit(self, record):
# 自定义格式
log_entry = f"{record.levelname}: {record.message}"
# 在此添加自己的日志记录逻辑
print(log_entry)
# 添加自定义的日志处理器
logger.addHandler(CustomHandler())
上述示例中,我们通过logging.getLogger方法获取FastAPI内部使用的uvicorn.error日志记录器,并创建了一个自定义的日志处理器CustomHandler,在emit方法中实现了自定义的日志格式和记录逻辑。然后,我们通过addHandler方法将自定义的日志处理器添加到FastAPI的日志记录器中。
3. 使用第三方日志库
除了使用FastAPI内置的日志功能外,我们还可以使用第三方的日志库来记录原始的HTTP请求和响应。常用的第三方日志库包括loguru、python-json-logger等。下面是一个使用loguru记录原始HTTP请求/响应的示例:
from fastapi import FastAPI
from loguru import logger
app = FastAPI()
@app.middleware("http")
async def log_request(request: Request, call_next):
# 记录请求的细节
logger.debug(f'Request: {request.method} {request.url.path}')
# 记录请求的原始内容
request_body = await request.body()
logger.debug(f'Request body: {request_body.decode()}')
response = await call_next(request)
# 记录响应的细节
logger.debug(f'Response: {response.status_code}')
# 记录响应的原始内容
response_body = await response.body()
logger.debug(f'Response body: {response_body.decode()}')
return response
上述示例中,我们使用loguru.logger来记录原始的HTTP请求和响应。我们可以通过添加自定义的日志记录逻辑来满足我们的需求。
总结
本文介绍了如何在Python FastAPI中记录原始的HTTP请求和响应。我们可以使用FastAPI内置的Middleware、自定义日志格式和第三方日志库来满足我们的需求。了解每个请求的详细信息对于调试和监控非常重要,通过记录原始的HTTP请求和响应,我们可以获得请求和响应的所有细节,帮助我们进行调试、错误追踪和性能优化。希望本文对您有所帮助。
极客教程