马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、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 logging
- class RequestLogMiddleware:
- def __init__(self, get_response):
- self.get_response = get_response
- self.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.中心件四个方法
- 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}')
复制代码
- 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__}')
复制代码
- 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)
复制代码
- 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 参数都是同一个哀求对象
|