Django 中间件实战:定义、注册与全局异常处理
Django 中间件是处理请求和响应的全局钩子。本文演示如何创建中间件类,注册到 settings.py,并通过 process_exception 实现全局异常处理。
中间件的定义与生命周期
在 Django 项目中,中间件类通常定义在应用目录下的 middleware.py 文件中。文件名可以自定义,但类名需明确。中间件类的核心在于其内置方法,这些方法在请求的不同阶段被自动调用。
核心方法说明
- __init__:服务器重启后接收第一个请求时调用,仅执行一次。
- process_request:在生成 request 对象后、URL 匹配前调用。若返回 HttpResponse 对象,则跳过后续视图函数,直接执行 process_response。
- process_view:URL 匹配成功后、视图函数调用前执行。同样,若返回响应对象,则拦截请求。
- process_response:视图函数执行完毕后、响应返回浏览器前调用。通常需返回 response 对象。
全局异常处理中间件
为了捕获视图函数抛出的异常,可以定义 process_exception 方法。当视图函数发生异常时,Django 会调用此方法。若注册了多个处理异常的中间件,其执行顺序与注册顺序相反。
from django.http import HttpResponse
# 定义中间件类。 (类名可以任意,但类中的方法名是固定的)
class TestMiddleware(object):
'''中间件类'''
def __init__(self):
'''服务器重启之后,接收第一个请求时调用(只会调用一次)'''
print('----init----')
# 中间件函数。(用到哪个函数写哪个,不需要全写)
def process_request(self, request):
'''产生request对象之后,url匹配之前调用'''
print('----process_request----')
# return HttpResponse('process_request') # 默认放行,不拦截请求。
def process_view(self, request, view_func, *view_args, **view_kwargs):
'''url匹配之后,视图函数调用之前调用'''
print('----process_view----')
# view_func: url匹配到的视图函数。
return HttpResponse('process_view') # return HttpResponse对象,表示拦截,直接执行process_response函数。
def process_response(self, request, response):
'''视图函数调用之后,response返回浏览器之前'''
print('----process_response----')
return response # 一般会返回响应。
# 定义中间件类,处理全局异常
class ExceptionTestMiddleware(object):
# 如果注册多个process_exception函数,那么函数的执行顺序与注册的顺序相反。(其他中间件函数与注册顺序一致)
# 中间件函数,用到哪个就写哪个,不需要写所有的中间件函数。
def process_exception(self, request, exception):
'''视图函数发生异常时调用'''
print('----process_exception1----')
print(exception)中间件的注册
定义好中间件后,需在项目配置文件 settings.py 的 MIDDLEWARE 列表中进行注册。注册格式为 '应用名.middleware.中间件类名'。
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'booktest.middleware.TestMiddleware', # 注册中间件类 (中间件类所在py文件路径.类名)
'booktest.middleware.ExceptionTestMiddleware',
# 如果注册多个process_exception函数,那么函数的执行顺序与注册的顺序相反。
)
总结
通过上述步骤,您可以灵活控制 Django 请求的生命周期,并实现全局异常捕获。中间件是处理跨切面逻辑(如日志、权限、异常)的理想选择。
以上就是 Django 中间件定义、注册与全局异常处理的详细内容,更多关于 Django 开发技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













