头图

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 = "<h1>abc</h1>"
    1 / 0
    return HttpResponse(html)

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

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

如果想获取更多相关文章,可扫码关注阅读:
image.png


7 声望
6 粉丝
0 条评论
推荐阅读
Redis基础命令汇总,看这篇就够了
本篇笔记将汇总 Redis 基础命令,包括几个常用的通用命令,和各个类型的数据的操作,包括字符串、哈希、列表、集合、有序集合等在内的基本操作。

Hunter

封面图
基于Sanic的微服务基础架构
使用python做web开发面临的一个最大的问题就是性能,在解决C10K问题上显的有点吃力。有些异步框架Tornado、Twisted、Gevent 等就是为了解决性能问题。这些框架在性能上有些提升,但是也出现了各种古怪的问题难以...

jysong6阅读 4k评论 3

又一款眼前一亮的Linux终端工具!
今天给大家介绍一款最近发现的功能十分强大,颜值非常高的一款终端工具。这个神器我是在其他公众号文章上看到的,但他们都没把它的强大之处介绍明白,所以我自己体验一波后,再向大家分享自己的体验。

良许6阅读 1.8k

初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。

王中阳Go4阅读 1.7k评论 2

封面图
FastAPI性能碾压Flask?
不止一次的听过,FastAPI性能碾压Flask,直追Golang,不过一直没有测试过,今天闲着没事测试一下看看结果。不知道是哪里出了问题,结果大跌眼镜。

二毛erma02阅读 10.2k评论 3

封面图
Vue+Express+Mysql全栈项目之增删改查、分页排序导出表格功能
本文记录一下实现一个全栈项目,前端使用vue框架、后端使用express框架、数据库使用mysql。此项目的意义不仅仅有助于我们复习nodejs相关知识、更有助于带前端新人,使其快速从整体全局角度中,理解常规后台管理系...

水冗水孚4阅读 2.6k

MySQL百万数据深度分页优化思路分析
一般在项目开发中会有很多的统计数据需要进行上报分析,一般在分析过后会在后台展示出来给运营和产品进行分页查看,最常见的一种就是根据日期进行筛选。这种统计数据随着时间的推移数据量会慢慢的变大,达到百万...

一个程序员的成长7阅读 927

封面图
7 声望
6 粉丝
宣传栏