zoukankan      html  css  js  c++  java
  • django restframework 全局异常处理,编写自定义custom_exception_handler

     
    import logging
    from rest_framework.views import exception_handler as rest_handler
    from rest_framework.response import Response
    from django.db import DatabaseError
    from redis.exceptions import RedisError
    from greentea.response_util import RestResponse
    
    c_fmt = "[%(levelname)s]%(asctime)s %(filename)s.%(funcName)s():line %(lineno)d :
    %(message)s"
    date_format = "%Y-%m-%d %H:%M:%S %a"
    logging.basicConfig(level=logging.INFO, format=c_fmt, datefmt=date_format)
    logger = logging.getLogger("drf")
    
    
    def exception_handler(exc, context):
        """
        :param exc: 异常
        :param context: 上下文
        :return: Response object
        """
    
        response = rest_handler(exc, context)
        context_view = context.get("view", None)
        context_path = context.get('request').path
        context_method = context.get('request').method
        context_ip = context.get('request').META.get("REMOTE_ADDR")
        if response is None:
            logger.error('%s,%s' % (context_view, exc))
            response = Response(
                {'success': False, 'msg': str(exc).replace('\', ''), "path": context_path, "method": context_method,
                 'remote_address': context_ip})
            return response
        if response.status_code == 400:
            response = RestResponse(data=response.data, code=response.status_code, status=response.status_code,
                                    msg='400_bad request', success=False)
        if response.status_code == 404:
            response = RestResponse(data=response.data, code=response.status_code, status=response.status_code,
                                    msg='404_Not Found', success=False)
        if response.status_code == 401:
            response = RestResponse(data=response.data, code=response.status_code, status=response.status_code,
                                    msg='401_UNAUTHORIZED', success=False)
        if response.status_code == 403:
            response = RestResponse(data=response.data, code=response.status_code, status=response.status_code,
                                    msg='403_FORBIDDEN ', success=False)
        if response.status_code == 405:
            response = RestResponse(data=response.data, code=response.status_code, status=response.status_code,
                                    msg='405_METHOD_NOT_ALLOWED', success=False)
        if 500 <= response.status_code <= 599:
            response = RestResponse(data=response.data, code=response.status_code, status=response.status_code,
                                    msg='INTERNAL_SERVER_ERROR', success=False)
        return response
    

      

    setting.py注册handler,

     
    {
      "success": false,
      "msg": ""None of [Index(['internal_code', 'project_name', 'version_content', 'version_code',n       'version_size', 'requirement_link', 'person_charge', 'release_time',n       'release_note', 'pass_rate', 'bug_number', 'requirement_change_number',n       'case_numbers'],n      dtype='object')] are in the [columns]"",
      "path": "/api/batch/import",
      "method": "POST",
      "remote_address": "127.0.0.1"
    }
    

     Response类重写:

     

    from rest_framework.response import Response
    from rest_framework.serializers import Serializer
    
    
    class RestResponse(Response):
    
        def __init__(self, msg=None, success=None, code=None, data=None, status=None,
                     template_name=None, headers=None,
                     exception=False, content_type=None):
            """
            Alters the init arguments slightly.
            For example, drop 'template_name', and instead use 'data'.
    
            Setting 'renderer' and 'media_type' will typically be deferred,
            For example being set automatically by the `APIView`.
            """
            super(RestResponse, self).__init__(self,None)
    
            if isinstance(data, Serializer):
                msg = (
                    'You passed a Serializer instance as data, but '
                    'probably meant to pass serialized `.data` or '
                    '`.error`. representation.'
                )
                raise AssertionError(msg)
            self.code = code
            self.msg = msg
            self.data = {"data": data or [], "msg": msg or "", "code": code, "success": success}
    
            self.template_name = template_name
            self.exception = exception
            self.content_type = content_type
    
            if headers:
                for name, value in headers.items():
                    self[name] = value
    

      

  • 相关阅读:
    迁移-Mongodb时间类数据比较的坑
    Kong在windows10的hyperV CentOS上安装
    C#文件上传编码乱码
    入职9个月感想
    单元测试遇到的Mock重载方法问题
    MongoDB wiredTiger存储引擎下的存储方式LSM和B-Tree比较
    【SQL Server】修改DB逻辑文件名称
    【winform】基于UserControl实现webBrower组件时html页面元素加载及onclick事件监听实现
    SQL server 数据连接池使用情况检测
    【Vue起步-Windows】N01:环境安装
  • 原文地址:https://www.cnblogs.com/SunshineKimi/p/14330068.html
Copyright © 2011-2022 走看看