本文介绍: 引入父类print(“这是第一个自定义中间件中的 process_request 方法“)print(“这是第二个自定义中间件中的 process_request 方法“)请求来的时候需要经过每一个中间件的 process_request 方法结果的顺序是按照配置文件中注册的中间件从上往下的顺序执行的如果没有定义这个方法,就跳过这个中间件如果在自定义中间件中定义了返回值(三板斧),那么请求将不再继续执行,而是直接原路返回(校验失败不允许访问)
一.介绍
1.什么是Django中间件
- Django中间件是一个轻量级、可重用的组件,用于处理Django请求和响应的过程
- 它提供了对请求和响应进行全局处理的机制,可以在请求达到视图之前进行预处理或在响应返回给客户端之前进行后处理
- 中间件是按照顺序依次执行的,每个中间件都可以对请求和响应进行修改、补充或处理
- 在Django的setting.py配置文件中,通过MIDDLEWARE设置来定义中间件的顺序
2.作用:
3.示例
class MyMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# 在视图函数调用之前的预处理逻辑
# ...
response = self.get_response(request)
# 在响应返回给客户端之前的后处理逻辑
# ...
return response
二.Django请求生命周期流程图
三.Django中间件是Django的门户
四.中间件方法
1.必须掌握的中间件方法
(1)process_request:
示例:
class CustomResponseMiddleware:
def process_response(self, request, response):
# 在这里对响应进行处理
response['X-Custom-Header'] = 'Custom Value'
return response
2.需要了解的中间件方法
(1)process_view
示例:
class LoggingMiddleware:
def process_view(self, request, view_func, view_args, view_kwargs):
# 在这里记录日志
logger.info(f"Request received: {request.path}")
# 返回None,继续执行原视图函数
return None
(2)process_template_response
- 该方法在视图函数返回一个TemplateResponse对象时调用。
- 它接收一个HttpRequest对象和一个TemplateResponse对象作为参数,并且必须返回一个TemplateResponse对象。
示例:
class GlobalContextMiddleware:
def process_template_response(self, request, response):
# 在这里添加全局的上下文数据
response.context_data['global_data'] = "Global Value"
return response
(3)process_exception
示例:
class ErrorHandlerMiddleware:
def process_exception(self, request, exception):
# 在这里处理异常
if isinstance(exception, CustomException):
# 如果自定义异常,返回一个定制的错误页面
return render(request, 'error.html', {'error': str(exception)})
else:
# 默认情况,返回一个500服务器错误
return HttpResponseServerError("Internal Server Error")
五.自定义中间件
1.process_request
1.路由层
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/',views.index),
]
2.视图层
def index(request):
print("这是视图函数index")
return HttpResponse("index 的返回值")
3.配置文件
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',
# 注册自己的中间件(在应用下创建路径会有提示,但是如果在项目下创建就没有提示,需要自己根据路径书写)
'app01.mymiddle.my_middle.MyMiddle',
# 谁先注册就先执行谁
'app01.mymiddle.my_middle.MyMiddle2',
]
4.自定义中间件
# -*-coding: Utf-8 -*-
# @File : my_middle .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/17
# 引入父类
from django.utils.deprecation import MiddlewareMixin
class MyMiddle(MiddlewareMixin):
def process_request(self, request):
print("这是第一个自定义中间件中的 process_request 方法")
class MyMiddle2(MiddlewareMixin):
def process_request(self, request):
print("这是第二个自定义中间件中的 process_request 方法")
5.总结
(1)执行顺序
(2)没有定义process_request
- 如果没有定义这个方法,就跳过这个中间件
(3)定义了返回值
(4)总结
2.process_response
# 引入父类
from django.utils.deprecation import MiddlewareMixin
class MyMiddle(MiddlewareMixin):
def process_request(self, request):
print("这是第一个自定义中间件中的 process_request 方法")
def process_response(self, request, response):
'''
:param request:
:param response: 就是Django返回给浏览器的内容
:return:
'''
print("这是第一个自定义中间件中的 process_response 方法")
# 必须返回 responser
return response
-
该方法必须返回 HttpResponse 对象
-
顺序是按照配置文件中注册过的中间件从下往上依次经过
- 如果没有定义,则跳过,校验下一个
3.小结
-
如果在第一个 process_request 方法就已经返回了 HttpResponse 对象,那么响应被返回的时候是经过所有的中间件里面的 process_response 方法还是会发生其他?
原文地址:https://blog.csdn.net/qq_65852978/article/details/134584112
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_10473.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。