A-A+

FastAPI request捕获异常post数据包 json数据包等

2021年08月27日 17:39 学习笔记 暂无评论 共1142字 (阅读1,681 views次)

【注意:此文章为博主原创文章!转载需注意,请带原文链接,至少也要是txt格式!】

fastapi使用的是异步架构,比很多python框架都快非常多。最近也是在使用这个框架,但是最近在捕获异常的时候发现一个问题。就是怎么都无法捕获POST的提交数据,参数和值都获取不到。

@app.exception_handler(StarletteException) # 自定义HttpRequest 请求异常,这个可以捕获所有的request请求,,get请求的参数,head头都能捕获到,唯独post提交的数据没办法捕获到。

@app.exception_handler(RequestValidationError) # 可以捕获post body的数据, 但是无法捕获404异常,也就是说,post存在的路径,而提交到一个404的path那么它没办法捕获到的。

我的同事还是比较有研究精神的,经过他的研究发现。StarletteException 这个异常类里面还是有东西的。

因为这个框架里面采用的就是异步的Starlette所以,极有可能因为异步原因导致。

 

最终的解决方案如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@app.exception_handler(StarletteException)
async def http_exception_handle(request, exc):
    """
    :param request: 请求必不可少
    :param exc: 错误栈处理
    :return:
    """
    body = b''
    async for chunk in request.stream():
        body += chunk
    with open(os.path.abspath('.') + "/log/" + request.client[0] + '_log.txt', "a", encoding='utf-8') as f:
        f.write('{} {}\n'.format(request.url, request.method))
        f.write(str(request.headers) + '\n')
        f.write(bytes.decode(body, encoding='utf-8', errors='ignore') + '\n')
        f.write('=============================================================\n')
    return JSONResponse(
        {"code": "402", "message": "这里就已经把所有的异常信息都已经捕获齐全了,body就是post的数据"})

官方的参考文档:https://www.starlette.io/requests/#body
还可以参考:https://github.com/encode/starlette/blob/master/starlette/requests.py

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×

给我留言