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)