diff --git a/src/utils/exception.py b/src/utils/exception.py index 64a2552..8111da4 100644 --- a/src/utils/exception.py +++ b/src/utils/exception.py @@ -1,9 +1,12 @@ +import logging + from fastapi import Request, status from fastapi.exceptions import HTTPException, RequestValidationError from fastapi.responses import JSONResponse from src.dtos import BaseResponse, ErrorModel +logger = logging.getLogger("uvicorn.error") class HttpCodeMsg: REGISTER_USER_ALREADY_EXISTS = "REGISTER_USER_ALREADY_EXISTS" @@ -24,32 +27,40 @@ class HttpCodeMsg: HTTP_503 = "SERVICE_UNAVAILABLE" HTTP_504 = "GATEWAY_TIMEOUT" - -def request_validation_error_handler(request: Request, exc: RequestValidationError): +def request_validation_error_handler(req: Request, exc: RequestValidationError): + """ + 请求响应校验错误处理 + :param req: + :param exc: + :return: + """ errors = exc.errors() - print(errors) - details = [] - for error in errors: - err_type = error["type"].split(".") - if len(err_type) == 2: - if err_type[0] == "value_error": - if err_type[1] == "missing": - if len(error["loc"]) == 2: - msg = f"{error['loc'][0]}: '{error['loc'][1]}' is required!" - else: - msg = "value is missing!" - else: - msg = error["msg"].replace("this value", f"'{error['loc'][1]}' value") - else: - msg = error["msg"] - details.append(msg) - else: - details.append(error["msg"]) - err = dict(code=status.HTTP_400_BAD_REQUEST, messages=HttpCodeMsg.HTTP_400, details="; ".join(details)) + logger.error(f"{req.method} {req.url} , errors: {errors}") + response_errors = [error for error in errors if error["loc"][0] == "response"] + if len(response_errors) > 0: + message = "接口响应异常 " + else: + message = "接口请求异常 " + json_err = [err["msg"] for err in errors if "value_error.jsondecode" == err["type"]] + if json_err: + message += "请求参数JSON编码有误;" + value_err = [err["msg"] for err in errors if "value_error" == err["type"]] + if value_err: + message += "; ".join(value_err) + missing_err = [err["loc"][-1] for err in errors if "value_error.missing" == err["type"]] + if missing_err: + message += "缺少字段:{} ".format(", ".join(missing_err)) + type_err = [err["msg"].replace("value", f"{err['loc'][1]}") for err in errors if "type_error" == err["type"]] + if type_err: + message += "; ".join(type_err) + not_none_err = [err["loc"][-1] for err in errors if "type_error.none.not_allowed" == err["type"]] + if not_none_err: + message += "字段:{} 不能为空".format(", ".join(not_none_err)) + err = dict(code=status.HTTP_400_BAD_REQUEST, message=message, details=message) res = BaseResponse(**dict(result=None, error=err)) - return JSONResponse(status_code=status.HTTP_400_BAD_REQUEST, content=res.dict()) - + return JSONResponse(status_code=200, content=res.dict()) + def http_exception_handler(request: Request, exc: HTTPException): if exc.status_code == 400: err = ErrorModel(**dict(code=status.HTTP_400_BAD_REQUEST, messages=HttpCodeMsg.HTTP_400, details=exc.detail))