Files
cdtestplant_v1/utils/chen_ninja.py
2025-04-29 18:09:00 +08:00

46 lines
2.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)