Skip to content

全局异常与响应

定义了统一的响应格式和全局异常处理机制。所有 API 返回 {code, data, msg, ok} 标准格式。响应函数位于 utils/R.py

统一响应格式

utils/R.py 提供统一的响应生成函数:

python
from utils import R

# 成功响应
R.ok(data={"id": 1}, msg="操作成功")
# {"code": 0, "data": {"id": 1}, "msg": "操作成功", "ok": true}

# 失败响应
R.failed(msg="参数错误")
# {"code": 1, "data": null, "msg": "参数错误", "ok": false}

# 带扩展参数的响应
R.ok(data=list, total=100)
# {"code": 0, "data": [...], "msg": "操作成功", "ok": true, "total": 100}

响应函数说明

函数说明codeok
R.ok()成功响应0true
R.failed()失败响应1false
R.response()通用响应自定义自定义

函数签名:

python
def ok(data=None, msg="操作成功", code=0, **kwargs) -> JsonResponse:
    """生成成功响应,支持通过 kwargs 添加额外字段(如 total)"""

def failed(msg="操作失败", code=1, data=None, **kwargs) -> JsonResponse:
    """生成失败响应"""

def response(data=None, msg="操作成功", code=0, success=True, **kwargs) -> JsonResponse:
    """通用响应生成器(高级用法),允许完全自定义字段"""

分页响应

分页数据通过 R.ok() 传递:

python
# application/level/services.py
def get_level_page(request):
    # ... 分页查询逻辑 ...
    return R.ok(data={
        "records": records,
        "total": total,
        "size": size,
        "current": current,
        "pages": pages
    })

状态码常量

python
# utils/R.py
class Codes:
    SUCCESS = 0
    FAILED = 1
    UNAUTHORIZED = 401  # 未认证
    FORBIDDEN = 403     # 无权限
    NOT_FOUND = 404     # 资源不存在
    VALIDATE_ERROR = 422  # 验证错误
    SERVER_ERROR = 500  # 服务器错误

Services 层异常处理

在 service 层使用 try/except 捕获异常:

python
# application/level/services.py
def add_level(request):
    try:
        data = parse_request_body(request)
        form = LevelForm(data)

        if not form.is_valid():
            return R.failed(msg=regular.get_err(form))

        # 业务逻辑...
        Level.objects.create(**form.cleaned_data)
        return R.ok(msg="添加成功")

    except Exception as e:
        logger.error(f"添加职级失败: {str(e)}")
        return R.failed(msg="添加失败")

全局异常处理

Django 通过中间件处理全局异常:

python
# middleware/exception_middleware.py
class ExceptionMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        try:
            response = self.get_response(request)
            return response
        except Exception as e:
            logger.error(f"系统异常: {str(e)}")
            return R.failed(msg="服务器内部错误", code=500)

总结

全局异常与响应模块具备以下特点:

1. 统一格式:所有 API 返回 {code, data, msg, ok} 标准格式
2. R.ok()/R.failed():简洁的响应生成函数
3. Codes 常量:定义常用状态码
4. kwargs 扩展:支持通过 kwargs 添加额外字段
5. Services try/except:在 service 层捕获异常,返回友好提示
6. 全局异常:中间件捕获未处理异常,返回统一格式

小蚂蚁云团队 · 提供技术支持