Django 中间件

devtools/2024/9/25 7:25:53/

文章目录


一、Django中间件介绍

中间件是一种强大的机制,用于实现各种功能,比如身份验证、日志记录、压缩、内容过滤等

Django 中间件是一个可以处理请求和响应的钩子框架。它们可以在 Django 处理请求的不同阶段执行代码,从而对请求和响应进行处理或修改,可以理解为是介于 HttpRequest 与 HttpResponse 处理之间的一道处理过程

在请求到达视图之前,Django 会按顺序调用中间件的 process_request 方法
在响应返回给客户端之前,Django 会按相反的顺序调用中间件的 process_response 方法

二、中间件的主要方法

1.Django默认中间件

# 当 Django 启动时调用,通常用于初始化中间件
__init__(self, get_response): # 在视图函数被调用之前执行,接收 request 对象,可以返回 None 或 HttpResponse 对象
process_request(self, request): # 在视图函数执行之前被调用,接收视图函数的信息,可以返回 None 或 HttpResponse
process_view(self, request, view_func, view_args, view_kwargs): # 在视图处理完请求后执行,接收 response 对象,可以返回修改后的 HttpResponse
process_response(self, request, response): #当视图抛出异常时调用,可以返回 HttpResponse
process_exception(self, request, exception): 

中间件组件配置在 settings.py 文件的 MIDDLEWARE 选项列表中
Django 默认的中间件配置:

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]

2.自定义中间件

下面是一个简单的自定义中间件示例,用于记录请求的 URL 和响应状态码
在fa目录下新增一个middleware.py

import loggingclass RequestLogMiddleware:def __init__(self, get_response):self.get_response = get_responseself.logger = logging.getLogger(__name__)def __call__(self, request):# 处理请求前的日志记录self.logger.info(f'Income request: {request.path}')# 处理请求response = self.get_response(request)# 处理请求后的日志记录self.logger.info(f'Response status: {response.status_code}')return response

settings.py中增加中间件配置

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',# 添加中间件'fa.middleware.RequestLogMiddleware',
]

Django 的日志记录可以通过配置来输出到不同的目标,比如控制台或文件
默认情况下,Django 不会自动记录到文件,但你可以通过配置来实现
所以我们在settings.py里面增加LOGGING配置

# 日志配置
LOGGING = {'version': 1,'disable_existing_loggers': False,'formatters': {'verbose': {'format': '{levelname} {asctime} {module} {message}','style': '{',},},'handlers': {'file': {'level': 'DEBUG','class': 'logging.FileHandler','filename': os.path.join(BASE_DIR, 'django.log'),  # 日志文件路径'formatter': 'verbose',},},'loggers': {'fa.middleware': {  # 使用你的实际中间件模块路径'handlers': ['file'],'level': 'DEBUG',  # 确保级别足够低以捕获信息'propagate': True,},'django': {  # 确保 Django 的日志配置正常'handlers': ['file'],'level': 'DEBUG','propagate': True,},},
}

这个时候我们再去请求一下项目的任意路由可以看到fa同级目录下会有一个django.log
在这里插入图片描述

3.中间件四个方法

  1. process_request(self, request)
    作用:在 Django 处理请求之前调用,可以在这里对请求进行修改或检查
    返回值:可以返回 None(表示继续处理请求)或返回一个 HttpResponse 对象(表示请求处理终止,直接返回该响应)
# 参数解释
# self:
# 类型:中间件类的实例
# 作用:代表当前中间件的实例,允许访问类的属性和其他方法# request:
# 类型:django.http.HttpRequest 对象
# 作用:包含当前 HTTP 请求的所有信息,如请求方法、路径、GET/POST 数据、用户信息等def process_request(self, request):# 记录请求路径self.logger.info(f'Incoming request: {request.path}')
  1. process_view(self, request, view_func, view_args, view_kwargs)
    作用:在请求的视图函数被调用之前调用,可以访问视图函数及其参数
    返回值:可以返回 None(表示继续处理)或返回一个 HttpResponse 对象(终止请求处理并返回该响应)
# 参数解释
# self:
# 类型:中间件类的实例
# 作用:代表当前中间件的实例,允许访问类的属性和其他方法# request:
# 类型:django.http.HttpRequest 对象
# 作用:当前的 HTTP 请求对象# view_func:
# 类型:视图函数
# 作用:即将被调用的视图函数(或类视图的 as_view 方法)# view_args:
# 类型:列表(list)
# 作用:传递给视图函数的位置参数# view_kwargs:
# 类型:字典(dict)
# 作用:传递给视图函数的关键字参数def process_view(self, request, view_func, view_args, view_kwargs):# 记录即将调用的视图函数self.logger.info(f'About to call view: {view_func.__name__}')
  1. process_exception(self, request, exception)
    作用:当视图函数引发异常时调用。你可以在这里处理异常,例如记录日志或返回自定义错误响应
    返回值:可以返回 None(表示不处理该异常),或者返回一个 HttpResponse 对象(表示处理了该异常并返回了响应)
# 参数解释
# self:
# 类型:中间件类的实例
# 作用:代表当前中间件的实例,允许访问类的属性和其他方法# request:
# 类型:django.http.HttpRequest 对象
# 作用:当前的 HTTP 请求对象# exception:
# 类型:异常对象(Exception 的实例)
# 作用:视图函数中抛出的异常def process_exception(self, request, exception):# 记录异常self.logger.error(f'Exception occurred: {exception}')# 返回一个自定义错误响应return HttpResponse('An error occurred', status=500)
  1. process_response(self, request, response)
    作用:在视图函数处理完请求后调用,可以在这里对响应进行修改
    返回值:必须返回一个 HttpResponse 对象
# 参数解释
# self:
# 类型:中间件类的实例
# 作用:代表当前中间件的实例,允许访问类的属性和其他方法# request:
# 类型:django.http.HttpRequest 对象
# 作用:当前的 HTTP 请求对象# response:
# 类型:django.http.HttpResponse 对象
# 作用:即将返回给客户端的 HTTP 响应对象def process_response(self, request, response):# 记录响应状态self.logger.info(f'Response status: {response.status_code}')return response

工作流程:

1.请求进入中间件:
process_request 先执行
如果返回 HttpResponse,后续处理会被终止2.视图函数调用:
process_view 被调用,视图函数执行前可以进行进一步处理3.视图函数处理:
如果视图函数抛出异常,process_exception 将被调用4.响应返回:
视图函数返回响应后,process_response 被调用。

当配置多个中间件时,会按照 MIDDLEWARE中 的注册顺序,也就是列表的索引值,顺序执行,不同中间件之间传递的 request 参数都是同一个请求对象


http://www.ppmy.cn/devtools/116854.html

相关文章

【React】原理

笔记来源:小满zs 虚拟 DOM // react.js // jsx > babel | swc > React.createElement const React {createElement(type, props, ...children) {return {type,props: {...props,children: children.map(child > typeof child object ? child : React.cr…

PicoQuant公司:探索铜铟镓硒(CIGS)太阳能电池技术,引领绿色能源革新

铜铟镓硒(‌CIGS)‌薄膜太阳能电池具有生产成本低、污染小、不衰退、弱光性能好等显著特点,光电转换效率居各种薄膜太阳电池之首,接近于晶体硅太阳电池,而成本只是它的三分之一,被称为下一代非常有前途的新…

learn C++ NO.19——二叉搜索树

简单介绍一下二叉搜索树 二叉搜索树也称为二叉排序树。它是一种具有特殊性质的二叉树。它有如下性质。 1、当前节点的左子树的值一定小于当前节点,当前节点的右子树的值一锭大于当前节点。这也就意味着,在接近完全二叉树的情况下(高度较为合…

vue2 文本溢出那些事

概述 平时开发中,如果标题超出多行,我们希望出现省略号,并且为其添加简单提示。但是,如果我们在全局写公共class类,行数不好控制。如果统一加title=xxx,又会出现文本是否超出都会出现title的现象。 那么到底该如何实现?下面这里给出了一些参考思路和对应的代码 相关可…

面经 | webpack

webpack webpackloader基本语法rules自定义loader 你可以写哪些loader?常见loader pluginwebpack生命周期 [参考](https://blog.csdn.net/qq_17335549/article/details/137561075)常见plugin webpack 一个打包工具,就和npm是一个包管理工具差不多。一般…

openai最新o1上线(2024年09月12日)

gpt-4o-2024-08-06输出文本价格 10美元/M o1-preview输出价格 60美元/M https://lmarena.ai/?leaderboard 数字9.11和9.8谁大些 人工智能学习网站 https://chat.xutongbao.top/

使用 Puppeteer-Cluster 和代理进行高效网络抓取: 完全指南

文章目录 一、介绍?二、什么是 Puppeteer-Cluster?三、为什么代理在网络抓取中很重要?四、 为什么使用带代理的 Puppeteer-Cluster?五、分步指南: 带代理的 Puppeteer 群集5.1. 步骤 1:安装所需程序库5.2. …

开箱元宇宙| 探索 Great Entertainment Group 如何利用 Web3 和数字创新重新定义活动体验

有没有想过 Web3 等尖端技术是如何改变娱乐行业的?在本期「开箱元宇宙」系列中,我们与 Great Entertainment Group (GEG) 的 Web3 顾问 Rob Lacey 深度访谈,探讨这家充满活力的公司如何在其活动中开拓数字创新。 与我们一起揭示 GEG 如何将 …