Django 中心件

[复制链接]
发表于 2026-1-18 20:39:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

一、Django中心件先容

中心件是一种强大的机制,用于实现各种功能,好比身份验证、日记纪录、压缩、内容过滤等
Django 中心件是一个可以处理处罚哀求和相应的钩子框架。它们可以在 Django 处理处罚哀求的差异阶段实行代码,从而对哀求和相应举行处理处罚或修改,可以明白为是介于 HttpRequest 与 HttpResponse 处理处罚之间的一道处理处罚过程
在哀求到达视图之前,Django 会按次序调用中心件的 process_request 方法
在相应返回给客户端之前,Django 会按相反的次序调用中心件的 process_response 方法
二、中心件的重要方法

1.Django默认中心件

  1. # 当 Django 启动时调用,通常用于初始化中间件
  2. __init__(self, get_response):
  3. # 在视图函数被调用之前执行,接收 request 对象,可以返回 None 或 HttpResponse 对象
  4. process_request(self, request):
  5. # 在视图函数执行之前被调用,接收视图函数的信息,可以返回 None 或 HttpResponse
  6. process_view(self, request, view_func, view_args, view_kwargs):
  7. # 在视图处理完请求后执行,接收 response 对象,可以返回修改后的 HttpResponse
  8. process_response(self, request, response):
  9. #当视图抛出异常时调用,可以返回 HttpResponse
  10. process_exception(self, request, exception):
复制代码
中心件组件设置在 settings.py 文件的 MIDDLEWARE 选项列表中
Django 默认的中心件设置:
  1. MIDDLEWARE = [
  2.     'django.middleware.security.SecurityMiddleware',
  3.     'django.contrib.sessions.middleware.SessionMiddleware',
  4.     'django.middleware.common.CommonMiddleware',
  5.     'django.middleware.csrf.CsrfViewMiddleware',
  6.     'django.contrib.auth.middleware.AuthenticationMiddleware',
  7.     'django.contrib.messages.middleware.MessageMiddleware',
  8.     'django.middleware.clickjacking.XFrameOptionsMiddleware',
  9. ]
复制代码
2.自界说中心件

下面是一个简单的自界说中心件示例,用于纪录哀求的 URL 和相应状态码
在fa目次下新增一个middleware.py:
  1. import logging
  2. class RequestLogMiddleware:
  3.     def __init__(self, get_response):
  4.         self.get_response = get_response
  5.         self.logger = logging.getLogger(__name__)
  6.     def __call__(self, request):
  7.         # 处理请求前的日志日志记录
  8.         self.logger.info(f'Income request: {request.path}')
  9.         # 处理请求
  10.         response = self.get_response(request)
  11.         # 处理请求后的日志日志记录
  12.         self.logger.info(f'Response status: {response.status_code}')
  13.         return response
复制代码
在settings.py中增长中心件设置
  1. MIDDLEWARE = [
  2.     'django.middleware.security.SecurityMiddleware',
  3.     'django.contrib.sessions.middleware.SessionMiddleware',
  4.     'django.middleware.common.CommonMiddleware',
  5.     'django.middleware.csrf.CsrfViewMiddleware',
  6.     'django.contrib.auth.middleware.AuthenticationMiddleware',
  7.     'django.contrib.messages.middleware.MessageMiddleware',
  8.     'django.middleware.clickjacking.XFrameOptionsMiddleware',
  9.     # 添加中间件
  10.     'fa.middleware.RequestLogMiddleware',
  11. ]
复制代码
Django 的日记纪录可以通过设置来输出到差异的目的,好比控制台或文件
默认情况下,Django 不会主动纪录到文件,但你可以通过设置来实现
以是我们在settings.py内里增长LOGGING设置
  1. # 日志日志配置
  2. LOGGING = {
  3.     'version': 1,
  4.     'disable_existing_loggers': False,
  5.     'formatters': {
  6.         'verbose': {
  7.             'format': '{levelname} {asctime} {module} {message}',
  8.             'style': '{',
  9.         },
  10.     },
  11.     'handlers': {
  12.         'file': {
  13.             'level': 'DEBUG',
  14.             'class': 'logging.FileHandler',
  15.             'filename': os.path.join(BASE_DIR, 'django.log'),  # 日志文件路径
  16.             'formatter': 'verbose',
  17.         },
  18.     },
  19.     'loggers': {
  20.         'fa.middleware': {  # 使用你的实际中间件模块路径
  21.             'handlers': ['file'],
  22.             'level': 'DEBUG',  # 确保级别足够低以捕获信息
  23.             'propagate': True,
  24.         },
  25.         'django': {  # 确保 Django 的日志配置正常
  26.             'handlers': ['file'],
  27.             'level': 'DEBUG',
  28.             'propagate': True,
  29.         },
  30.     },
  31. }
复制代码
这个时间我们再去哀求一下项目的恣意路由可以看到fa同级目次下会有一个django.log

3.中心件四个方法


  • process_request(self, request)
    作用:在 Django 处理处罚哀求之前调用,可以在这里对哀求举行修改或查抄
    返回值:可以返回 None(表现继续处理处罚哀求)或返回一个 HttpResponse 对象(表现哀求处理处罚制止,直接返回该相应)
  1. # 参数解释
  2. # self:
  3. # 类型:中间件类的实例
  4. # 作用:代表当前中间件的实例,允许访问类的属性和其他方法
  5. # request:
  6. # 类型:django.http.HttpRequest 对象
  7. # 作用:包含当前 HTTP 请求的所有信息,如请求方法、路径、GET/POST 数据、用户信息等
  8. def process_request(self, request):
  9.     # 记录请求路径
  10.     self.logger.info(f'Incoming request: {request.path}')
复制代码

  • process_view(self, request, view_func, view_args, view_kwargs)
    作用:在哀求的视图函数被调用之前调用,可以访问视图函数及其参数
    返回值:可以返回 None(表现继续处理处罚)或返回一个 HttpResponse 对象(制止哀求处理处罚并返回该相应)
  1. # 参数解释
  2. # self:
  3. # 类型:中间件类的实例
  4. # 作用:代表当前中间件的实例,允许访问类的属性和其他方法
  5. # request:
  6. # 类型:django.http.HttpRequest 对象
  7. # 作用:当前的 HTTP 请求对象
  8. # view_func:
  9. # 类型:视图函数
  10. # 作用:即将被调用的视图函数(或类视图的 as_view 方法)
  11. # view_args:
  12. # 类型:列表(list)
  13. # 作用:传递给视图函数的位置参数
  14. # view_kwargs:
  15. # 类型:字典(dict)
  16. # 作用:传递给视图函数的关键字参数
  17. def process_view(self, request, view_func, view_args, view_kwargs):
  18.     # 记录即将调用的视图函数
  19.     self.logger.info(f'About to call view: {view_func.__name__}')
复制代码

  • process_exception(self, request, exception)
    作用:当视图函数引发非常时调用。你可以在这里处理处罚非常,比方纪录日记或返回自界说错误相应
    返回值:可以返回 None(表现不处理处罚该非常),大概返回一个 HttpResponse 对象(表现处理处罚了该非常并返回了相应)
  1. # 参数解释
  2. # self:
  3. # 类型:中间件类的实例
  4. # 作用:代表当前中间件的实例,允许访问类的属性和其他方法
  5. # request:
  6. # 类型:django.http.HttpRequest 对象
  7. # 作用:当前的 HTTP 请求对象
  8. # exception:
  9. # 类型:异常对象(Exception 的实例)
  10. # 作用:视图函数中抛出的异常
  11. def process_exception(self, request, exception):
  12.     # 记录异常
  13.     self.logger.error(f'Exception occurred: {exception}')
  14.     # 返回一个自定义错误响应
  15.     return HttpResponse('An error occurred', status=500)
复制代码

  • process_response(self, request, response)
    作用:在视图函数处理处罚完哀求后调用,可以在这里对相应举行修改
    返回值:必须返回一个 HttpResponse 对象
  1. # 参数解释
  2. # self:
  3. # 类型:中间件类的实例
  4. # 作用:代表当前中间件的实例,允许访问类的属性和其他方法
  5. # request:
  6. # 类型:django.http.HttpRequest 对象
  7. # 作用:当前的 HTTP 请求对象
  8. # response:
  9. # 类型:django.http.HttpResponse 对象
  10. # 作用:即将返回给客户端的 HTTP 响应对象
  11. def process_response(self, request, response):
  12.     # 记录响应状态
  13.     self.logger.info(f'Response status: {response.status_code}')
  14.     return response
复制代码
工作流程:
  1. 1.请求进入中间件:
  2. process_request 先执行
  3. 如果返回 HttpResponse,后续处理会被终止
  4. 2.视图函数调用:
  5. process_view 被调用,视图函数执行前可以进行进一步处理
  6. 3.视图函数处理:
  7. 如果视图函数抛出异常,process_exception 将被调用
  8. 4.响应返回:
  9. 视图函数返回响应后,process_response 被调用。
复制代码

当设置多个中心件时,会按照 MIDDLEWARE中 的注册次序,也就是列表的索引值,次序实行,差异中心件之间通报的 request 参数都是同一个哀求对象
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表