本文首发于公众号: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 的一个简单应用,也就是说如何判断用户是否登录的一个示例。

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

Django笔记三十一之全局异常处理的更多相关文章

  1. angular学习笔记(三十一)-$location(2)

    之前已经介绍了$location服务的基本用法:angular学习笔记(三十一)-$location(1). 这篇是上一篇的进阶,介绍$location的配置,兼容各版本浏览器,等. *注意,这里介绍 ...

  2. angular学习笔记(三十一)-$location(1)

    本篇介绍angular中的$location服务的基本用法,下一篇介绍它的复杂的用法. $location服务的主要作用是用于获取当前url以及改变当前的url,并且存入历史记录. 一. 获取url的 ...

  3. Spring Boot 2.X(十一):全局异常处理

    前言 在 Java Web 系统开发中,不管是 Controller 层.Service 层还是 Dao 层,都有可能抛出异常.如果在每个方法中加上各种 try catch 的异常处理代码,那样会使代 ...

  4. django笔记三之admin的管理

    django笔记三之admin的管理 设置自动admin应用 vim todos/settings.py INSTALLED_APPS = ( 'django.contrib.admin', 新版本已 ...

  5. ASP.NET Core 中间件的使用(三):全局异常处理机制

    前言 我们经常听到"秒修复秒上线",觉得很厉害的样子. 其实不然,这只是一个调侃而已,出现问题的方式很多(逻辑漏洞.代码异常.操作方式不正确等). 我们今天来说代码异常问题怎么快速 ...

  6. 论文阅读笔记三十一:YOLO 9000: Better,Faster,Stronger(CVPR2016)

    论文源址:https://arxiv.org/abs/1612.08242 代码:https://github.com/longcw/yolo2-pytorch 摘要 本文提出YOLO9000可以检测 ...

  7. 【Django笔记三】Django2.0配置mysql模型

    一.环境版本信息: 操作系统:windows10 Django版本:2.0.5 Python版本:3.6.4 Mysql版本: 5.5.53   安装mysql 二.安装Mysqlclient: 1. ...

  8. Java学习笔记三十一:Java 包(package)

    Java 包(package) 一:包的作用: 如果我们在使用eclipse等工具创建Java工程的时候,经常会创建包,那么,这个包是什么呢. 为了更好地组织类,Java 提供了包机制,用于区别类名的 ...

  9. PHP学习笔记三十一【const】

    <?php //常量都是public类型 // const 常量名=赋值 .变量名不需要加$符号,也不需要要访问修饰符,默认就是public class A{ const TAX_RATE=0. ...

  10. NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用

    NET MVC全局异常处理(一)   目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...

随机推荐

  1. easy-rsa 不同版本克隆

    1.克隆easy-rsa 并切换到2.0版本的分支 yum install -y git git clone https://github.com/OpenVPN/easy-rsa.git cd ea ...

  2. 基于C语言的小学生四则运算出题器

    一.实验目的以及项目来源: 目的: 1.帮助老师产出随机的海量四则运算符的运算题目. 2.每次题目的产出均为随机,增强同学的四则运算能力. 项目来源: 项目来源于软件开发与创新课程的结对编程,对100 ...

  3. 用requests库的get( )函数访问搜狗网站20次

    代码: import requests from bs4 import BeautifulSoup def getHTMLText(url): try: r=requests.get(url,time ...

  4. eclipse微服务续,Hystrix+Gateway+Config配置管理中心+Bus动态刷新配置

    Hystrix延迟和容错库 Gateway微服务网关 Config配置管理中心 Bus动态刷新配置 四.Hystrix延迟和容错库 SpringCloud默认已为Feign整合了hystrix,所以添 ...

  5. 渲染器的实现(1)--《vue.js设计与实现》

    function renderer(domString, container) { container.innerHTML = domString } let count = ref(1) rende ...

  6. mysql 8.0.30 忘记密码登录mysql:

    mysql 8.0.30 忘记密码登录mysql: cmd(使用管理员运行)-切换到mysql的bin目录下:一.输入命令:net stop mysql 停止服务: 二.输入命令:mysqld --c ...

  7. python之序列化与反序列化

    #!/usr/bin/env python# -*- coding:utf-8 -*-#Author:QiFeng Zhang'''序列化反序列化之json应用'''import json #导入js ...

  8. pushd 和 popd:对目录栈进行操作

    介绍 目录栈是保存目录的栈结构,当前目录处于该栈结构的顶端,可使用dirs查看目录栈的目录.pushd命令可添加一个目录到目录栈,popd命令会清除目录栈中的一个目录. dirs dirs有三个参数: ...

  9. DVWA-File Upload(文件上传)

    文件上传是很危险的漏洞,攻击者上传木马到服务器,可以获取服务器的操作权限 LOW 审计源码 <?php if( isset( $_POST[ 'Upload' ] ) ) { // 定义 文件上 ...

  10. 与NewBing一起写作:《Web应用安全入门》

    前言 本文内容基于我的<Web应用安全入门>公开课视频. Prompt:下面是一篇课程音频转录后的文本,请把它转成老师和学生对话形式的文本,要求遵循原文结构,语言衔接流畅,保持 Markd ...