• Django笔记三十一之全局异常处理


    本文首发于公众号:Hunter后端

    原文链接:Django笔记三十一之全局异常处理

    这一篇笔记介绍 Django 的全局异常处理。

    当我们在处理一个 request 请求时,会尽可能的对接口数据的格式,内部调用的函数做一些异常处理,但可能还是会有一些意想不到的漏网之鱼,造成程序的异常导致不能正常运行,甚至会直接报给前端一个错误。

    为了避免这种情况的发生,令我们的后端服务看起来是正常的,就算有报错也可以很体面的给前端一个提示,以及后端做一些错误日志的记录,这里我们引入全局异常的处理。

    这里我们会用 Django 的中间件和日志的处理来实现,在本系列文章的第二十九篇和第三十篇,可以先熟悉下这两部分功能的使用。

    在介绍中间件的章节,我们介绍了 __call__() 和 process_view() 函数,其实还有一个 process_exception() 函数,这个函数就是当我们的请求在发生不可预知的报错的情况下,会自动调用的函数。

    我们来看这样一个处理的示例:

    # hunter/middlewares/exception_middleware.py
    
    import traceback
    from django.http import JsonResponse
    import logging
    
    logger = logging.getLogger(__name__)
    
    
    class ExceptionMiddleware:
    
        def __init__(self, get_response):
            self.get_response = get_response
    
        def __call__(self, request):
            response = self.get_response(request)
            return response
    
        def process_exception(self, request, exception):
    
            traceback_info = traceback.format_exc()
            logger.info(f"request_path: {request.path}, traceback_info: {traceback_info}")
            return JsonResponse({"code": -1, "msg": "error"}, status=500)
    

    在这里,我们使用 traceback.format_exc() 函数获取到 exception 的报错信息,然后通过 logger 日志打印输出。

    日志信息

    这里我们主要输出两个信息,一个是接口请求的路径,request.path,一个是报错信息 traceback_info,当然,这里我们还可以记录更多的信息,比如请求的用户信息,请求的参数等。

    记录之后,后端就可以通过日志的具体信息去查看到底是哪里出了问题。

    返回报错

    在这里,调用 process_exception() 函数之后,我们这里直接 return 了 response,还有一个 http 的状态码 status=500,这些信息都是可以自己拟定的,到时候和前端约定好,检测返回了某个状态码比如 500,然后就友好的显示某个报错弹窗信息,比如后台正在处理报错等。

    调用中间件

    定义好这个中间件之后,我们就需要在 settings.py 里去引用这个中间件,比如这个中间件我们放置的目录是 hunter/middlewares/exception_middleware.py,就需要在 hunter/settings.py 的 MIDDLEWARE 末尾加上 'hunter.middlewares.exception_middleware.ExceptionMiddleware', 这一条。

    # hunter/settings.py
    
    MIDDLEWARE = [
        ...
        'hunter.middlewares.exception_middleware.ExceptionMiddleware',
    ]
    

    测试报错

    我们去尝试触发报错信息,比如之前在 第二十九篇笔记中写的一个接口,这里我们修改一下,直接报错:

    # blog/views.py
    
    from django.http import HttpResponse, JsonResponse
    
    def time_view(request):
        html = "

    abc

    "
    1 / 0 return HttpResponse(html)

    然后在页面或者 postman 里调用该接口,就可以在 logger 指定的日志文件里看到关于这一行的具体报错信息啦。

    以上就是本篇笔记的全部内容,接下来我会接着介绍一下 Django 里 session 的一个简单应用,也就是说如何判断用户是否登录的一个示例。

    如果想获取更多后端相关文章,可扫码关注阅读:

    image

  • 相关阅读:
    黑马JVM总结(二十二)
    C/C++面试常见问题——static关键字的主要用法
    如何做到人声和背景音乐分离?记住这个宝藏网站~
    拆解美图SaaS:开着飞机换引擎
    Java连接FTP服务器上传文件报错
    《发现的乐趣》作者费曼(读书笔记)
    攻防视角下,初创企业安全实战经验分享
    FPGA project : flash_read
    2022年度高中级职称申报材料组卷相关表格及组卷要求的通知
    Java面试-轻松搞定Java面试集合相关题目
  • 原文地址:https://www.cnblogs.com/hunterxiong/p/17357139.html