“”"
中间件的本质就是装饰器,只不过被中间件装饰的是Django项目中的视图函数
中间件实现了对请求和响应的拦截和过滤,可以对请求和响应做额外的处理
中间件更常用的名字叫做拦截过滤器(filter / interceptor)
"""
import logging
from django.shortcuts import render
# 通过Python标准库logging模块的getLogger获取日志记录器
logger = logging.getLogger('django.request')
def exception_handler_middleware(view_func):
def wrapper(request, *args, **kwargs):
# 拦截用户请求做出相应的处理
resp = view_func(request, *args, **kwargs)
# 拦截服务器给用户的响应做出相应的处理
# 检测响应状态码是不是5xx ---> 服务器程序出问题
# 2xx ---> 请求成功
# 3xx ---> 重定向(给浏览器发送一个新的URL,让浏览器重新请求新的URL)
# 4xx ---> 请求有问题
# ~ 404 ---> Not Found
# ~ 401 ---> Unauthorized
# ~ 403 ---> Forbidden
# ~ 405 ---> 请求方法不支持
# ~ 400 ---> 请求数据格式不对
# 5xx ---> 服务器程序有问题
if str(resp.status_code).startswith('5'):
# 生成一条日志记录这个错误以便通过追踪日志定位错误解决问题
# 写日志的时候需要根据日志的级别调用不同的方法
# debug --- 调试信息
# info --- 普通(正常)信息
# warning --- 警告信息
# error --- 错误信息
# critical --- 致命错误信息
logger.error(f'{request.method} {request.path} ---> {resp.status_code}')
# 渲染专门定制的优雅的错误页给用户
return render(request, 'error.html')
return resp
return wrapper
需要把拦截过滤器注册到setting中的MIDDLEWARE里面
因为需要触发其他拦截过滤器才能触发异常过滤 那么要写在中间键的最后面 中间键是从上往下请求 从下往上响应
下面是配置日志处理器和日志生成器
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
# 配置日志处理器
'handlers': {
'file': {
'level': 'WARNING',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'error.log'),
},
'console': {
'class': 'logging.StreamHandler',
},
},
# 配置日志记录器
'loggers': {
'django.request': {
'handlers': ['file', 'console'],
'level': 'WARNING',
'propagate': True,
},
},
}