mirror of
https://github.com/insistence/RuoYi-Vue3-FastAPI.git
synced 2026-10-03 08:49:12 +00:00
* feat: 新增文件管理功能,提升文件服务安全性 * docs: 新增文件管理使用文档 * docs: 更新README文档 * feat: 新增业务附件组件 * feat: 新增文件存储对账中心 * docs: 更新README文档 * feat: 新增到期文件处置功能 * perf: 完善上传人权限显式化 * feat: 新增Range 与断点下载 * docs: 更新README文档
89 lines
3.4 KiB
Python
89 lines
3.4 KiB
Python
from fastapi import FastAPI, Request, Response
|
|
from fastapi.exceptions import HTTPException
|
|
from pydantic_validation_decorator import FieldValidationError
|
|
|
|
from exceptions.exception import (
|
|
AuthException,
|
|
FileRangeNotSatisfiableException,
|
|
LoginException,
|
|
ModelValidatorException,
|
|
PermissionException,
|
|
ServiceException,
|
|
ServiceWarning,
|
|
)
|
|
from utils.log_util import logger
|
|
from utils.response_util import JSONResponse, ResponseUtil, jsonable_encoder
|
|
|
|
|
|
def handle_exception(app: FastAPI) -> None:
|
|
"""
|
|
全局异常处理
|
|
"""
|
|
|
|
# 自定义token检验异常
|
|
@app.exception_handler(AuthException)
|
|
async def auth_exception_handler(request: Request, exc: AuthException) -> Response:
|
|
return ResponseUtil.unauthorized(data=exc.data, msg=exc.message)
|
|
|
|
# 自定义登录检验异常
|
|
@app.exception_handler(LoginException)
|
|
async def login_exception_handler(request: Request, exc: LoginException) -> Response:
|
|
return ResponseUtil.failure(data=exc.data, msg=exc.message)
|
|
|
|
# 自定义模型检验异常
|
|
@app.exception_handler(ModelValidatorException)
|
|
async def model_validator_exception_handler(request: Request, exc: ModelValidatorException) -> Response:
|
|
logger.warning(exc.message)
|
|
return ResponseUtil.failure(data=exc.data, msg=exc.message)
|
|
|
|
# 自定义字段检验异常
|
|
@app.exception_handler(FieldValidationError)
|
|
async def field_validation_error_handler(request: Request, exc: FieldValidationError) -> Response:
|
|
logger.warning(exc.message)
|
|
return ResponseUtil.failure(msg=exc.message)
|
|
|
|
# 自定义权限检验异常
|
|
@app.exception_handler(PermissionException)
|
|
async def permission_exception_handler(request: Request, exc: PermissionException) -> Response:
|
|
return ResponseUtil.forbidden(data=exc.data, msg=exc.message)
|
|
|
|
# 自定义服务异常
|
|
@app.exception_handler(ServiceException)
|
|
async def service_exception_handler(request: Request, exc: ServiceException) -> Response:
|
|
logger.error(exc.message)
|
|
return ResponseUtil.error(data=exc.data, msg=exc.message)
|
|
|
|
# 自定义服务警告
|
|
@app.exception_handler(ServiceWarning)
|
|
async def service_warning_handler(request: Request, exc: ServiceWarning) -> Response:
|
|
logger.warning(exc.message)
|
|
return ResponseUtil.failure(data=exc.data, msg=exc.message)
|
|
|
|
# 文件Range范围不可满足异常
|
|
@app.exception_handler(FileRangeNotSatisfiableException)
|
|
async def file_range_not_satisfiable_exception_handler(
|
|
request: Request,
|
|
exc: FileRangeNotSatisfiableException,
|
|
) -> Response:
|
|
return Response(
|
|
status_code=416,
|
|
headers={
|
|
'Accept-Ranges': 'bytes',
|
|
'Content-Range': f'bytes */{exc.file_size}',
|
|
'Content-Length': '0',
|
|
},
|
|
)
|
|
|
|
# 处理其他http请求异常
|
|
@app.exception_handler(HTTPException)
|
|
async def http_exception_handler(request: Request, exc: HTTPException) -> Response:
|
|
return JSONResponse(
|
|
content=jsonable_encoder({'code': exc.status_code, 'msg': exc.detail}), status_code=exc.status_code
|
|
)
|
|
|
|
# 处理其他异常
|
|
@app.exception_handler(Exception)
|
|
async def exception_handler(request: Request, exc: Exception) -> Response:
|
|
logger.exception(exc)
|
|
return ResponseUtil.error(msg=str(exc))
|