Django 中间件实战:定义、注册与全局异常处理

Chloe
Chloe
发布时间:2026-10-11 | 3人浏览过
原创

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 开发技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表