乐趣区

关于python: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 的一个简略利用,也就是说如何判断用户是否登录的一个示例。

本文首发于自己微信公众号:Django 笔记。

原文链接:Django 笔记三十一之全局异样解决

如果想获取更多相干文章,可扫码关注浏览:

退出移动版