Pārlūkot izejas kodu

优化restformwork,取消中间件,增加自定义返回中间件

yf_fyh 3 gadi atpakaļ
vecāks
revīzija
7bd933ff87
4 mainītis faili ar 71 papildinājumiem un 1 dzēšanām
  1. 13 1
      bigdataAPI/settings.py
  2. 25 0
      utils/exception.py
  3. 0 0
      utils/middleware.py
  4. 33 0
      utils/rendererresponse.py

+ 13 - 1
bigdataAPI/settings.py

@@ -49,7 +49,7 @@ MIDDLEWARE = [
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
-    'bigdataAPI.middleware.ResponseMiddleware'
+    # 'bigdataAPI.middleware.ResponseMiddleware'  自定义返回 比 中间件 感觉好用
 ]
 
 ROOT_URLCONF = 'bigdataAPI.urls'
@@ -126,3 +126,15 @@ USE_TZ = True
 # https://docs.djangoproject.com/en/2.1/howto/static-files/
 
 STATIC_URL = '/static/'
+
+
+
+
+REST_FRAMEWORK = {
+    # 全局配置异常模块
+    'EXCEPTION_HANDLER': 'utils.exception.custom_exception_handler',
+    # 修改默认返回JSON的renderer的类
+    'DEFAULT_RENDERER_CLASSES': (
+        'utils.rendererresponse.customrenderer',
+    ),
+}

+ 25 - 0
utils/exception.py

@@ -0,0 +1,25 @@
+"""
+自定义异常处理
+通过restformwork 的setting配置引用  REST_FRAMEWORK --> EXCEPTION_HANDLER
+"""
+
+from rest_framework.views import exception_handler
+from rest_framework.views import Response
+from rest_framework import status
+
+
+def custom_exception_handler(exc, context):
+    response = exception_handler(exc, context)
+    if response is None:
+        return Response({
+            'code': response.status_code,
+            'msg': 'error:{exc}'.format(exc=exc),
+            'data': ''
+        }, status=status.HTTP_500_INTERNAL_SERVER_ERROR, exception=True)
+
+    else:
+        return Response({
+            'code': response.status_code,
+            'msg': 'error:{exc}'.format(exc=exc),
+            'data': ''
+        }, status=200, exception=True)

bigdataAPI/middleware.py → utils/middleware.py


+ 33 - 0
utils/rendererresponse.py

@@ -0,0 +1,33 @@
+'''
+自定义返回处理
+'''
+
+# 导入控制返回的JSON格式的类
+from rest_framework.renderers import JSONRenderer
+
+
+class customrenderer(JSONRenderer):
+    # 重构render方法
+    def render(self, data, accepted_media_type=None, renderer_context=None):
+        print(data)
+        # print(renderer_context["response"])
+        # print(renderer_context["response"].status_code)
+        # print(renderer_context["response"].accepted_media_type)
+        if renderer_context:
+            if isinstance(data, dict):
+                msg = data.pop('msg', 'success')
+                code = data.pop('code', renderer_context["response"].status_code)
+                payload = data.pop('data', data)
+            else:
+                msg = "success"
+                code = renderer_context["response"].status_code
+                payload = data
+            ret = {
+                'code': code,
+                'msg': msg,
+                'data': payload,
+            }
+            # 返回JSON数据
+            return super().render(ret, accepted_media_type, renderer_context)
+        else:
+            return super().render(data, accepted_media_type, renderer_context)