Files

46 lines
2.4 KiB
Python
Raw Permalink Normal View History

2025-04-29 18:09:00 +08:00
from ninja_extra import NinjaExtraAPI
from django.http import HttpRequest, HttpResponse
from typing import Any
from utils.codes import HTTP_USER_PASSWORD_ERROR_CODE
# 重写ninja返回 - 全局统一视图函数返回如果None则如下返回
class ChenNinjaAPI(NinjaExtraAPI):
def create_response(
self, request: HttpRequest, data: Any, *, status: int = 200, code: int = 200, message: str = "请求成功",
temporal_response: HttpResponse = None,
) -> HttpResponse:
std_data = {
"code": code,
"data": data,
"message": message,
"success": True
}
# 因为extra的APIException会添加到data['detail']里面的,所以做一致性处理转换
if std_data['data'] is not None:
if 'detail' in std_data['data']:
std_data['message'] = std_data['data']['detail']
# ~~~~~~~~~~正常异常,status进行通用处理:TODO:后续规划~~~~~~~~~~
# 1.当状态码为403时候给前端提示message
if status == 403:
std_data['message'] = '您没有权限这样做'
# 2.当状态码为401时候根据APIException处理
elif status == 401:
if (std_data['data']['detail'] == '找不到指定凭据对应的有效用户' or
std_data['data']['detail'] == 'No active account found with the given credentials'):
std_data['message'] = '账号或密码错误,如果是内网登录检查密码是否过期...'
std_data['data']['code'] = HTTP_USER_PASSWORD_ERROR_CODE # TODO:后续单独以枚举方式定义code
else:
std_data['message'] = '您的token已过期请重新登录'
# 3.因为前端是获取message所以这里处理
elif status != 200 and std_data['message'] == '请求成功':
std_data['message'] = '请求失败,请检查'
elif status == 404:
std_data['message'] = '未找到相应的内容,请检查参数'
elif status == 422:
std_data['message'] = '请求的参数或响应数据未通过验证'
content = self.renderer.render(request, std_data, response_status=status)
content_type = "{}; charset={}".format(
self.renderer.media_type, self.renderer.charset
)
return HttpResponse(content, status=status, content_type=content_type)