在使用FastAPI的时候,我想对每个请求进行记录,包括框架接口返回的422类参数不符合要求的接口,同时把所有请求的原始post数据和返回的json等数据进行记录,之前在这篇文章:http://www.04007.cn/article/957.html 里到是提到了可以使用request_exception_handler在异常的时候获取请求实体,但不适合正常的请求中处理,所以这次需要寻找新的办法。本文地址:http://www.04007.cn/article/1179.html,未经许可,不得转载.
找了不少办法,目前还是下面的这个办法比较好用。首先我们是使用FastAPI官网的middleware中间件,注册一个http中间件,引入request和call_next来进行请求的转发处理。本文地址:http://www.04007.cn/article/1179.html,未经许可,不得转载.
async def set_body(request: Request): receive_ = await request._receive() async def receive(): return receive_ request._receive = receive @app.middleware("http") async def logger_request(request: Request, call_next): """获取request body""" await set_body(request) data = await request.json() # 取json格式 #data = await request.body() response = await call_next(request)使用上面的方法在一般的数据请求接口中都是能使用的,但在开发中我遇到了一些接口会出现问题,比如有图片或文件上传的接口就会发生问题,因此我最后在请求的处理上做了一些判断,对request.headers.get('content-type')判断是否存在multipart/form-data; boundary=字符,如果是文件上传则不获取真正的原始内容(会导致请求一直挂着且无法正常进行),代码如下:本文地址:http://www.04007.cn/article/1179.html,未经许可,不得转载.
content_type = request.headers.get('content-type') or '' if 'multipart/form-data; boundary=' in content_type: request_text = "{'file_upload': 1}" else: await set_body(request) request_text = await request.body() request_text = str(request_text.decode("utf-8"))基于上面这些程序功能,我实现了将FastAPI每个请求都进行了记录,包括请求的http头信息以及请求中的post内容和响应的json数据等。另外不建议使用request.json()获取json格式数据,因为有时会出现异常问题。本文地址:http://www.04007.cn/article/1179.html,未经许可,不得转载.
request_text = await request.body() request_text = str(request_text.decode("utf-8"))本文地址:http://www.04007.cn/article/1179.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/1179.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
![]() |
![]() |
手机扫码直接打开本页面 |