目录
一、原理
(一)理解
1. 作用
(1)修改请求request
(2)修改响应response
2. 配置
3. 延伸 - 钩子(hooks) 框架
(二)执行顺序
1. request、view、response 之间
2. 多个 middleware 之间
二、常见中间件
(一)默认中间件
(二)常见中间件
三、自定义中间件
(一)自定义方法(理论)
1. 传统方法(五大钩子函数)
2. Django官方推荐方法
(二)自定义制作(实战)
1. 新建中间件文件
2. settings.py 里
是修改请求和响应对象的钩子。
是介于请求request和响应response之间的处理过程。
担任“浏览器请求”和“视图处理请求”的中间角色,修改传送到 view 中的 HttpRequest 对象。
担任“视图返回响应”和“浏览器获取响应”的中间角色,view 返回的 HttpResponse 对象。
在settings.py的 MIDDLEWARE=[ ] 中,放置中间件
Django钩子是指一些方法或函数,在特定事件或过程中被触发。用于自定义拦截并处理一些函数调用、事件、消息的代码
request > middleware > view > middleware > response
在“request”后 &“view视图处理”前,中间件会按照settings.py设定的位置,由上往下执行;
在“view视图处理”后 &“response”前,中间件会按照settings.py设定的位置,由下往上执行;
举例:
若中间件 A、B、C 中,B依赖于 A 中的参数,则设定位置时需将 B 放在 A 的后面。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', # 开启网络安全保护
'django.contrib.sessions.middleware.SessionMiddleware', # 开启session缓存,缓存请求和响应数据,以提高性能和减少响应时间
'django.middleware.common.CommonMiddleware', # 通用中间件,可自动为URL路由添加www前缀和斜杠后缀
'django.middleware.csrf.CsrfViewMiddleware', # 开启跨域请求伪造的安全防御
'django.contrib.auth.middleware.AuthenticationMiddleware', # 验证用户身份(request.user)、授予或拒绝访问权限
'django.contrib.messages.middleware.MessageMiddleware', # 消息中间件,开启cookie或会话的消息
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
MIDDLEWARE = [
# . . .
'django.middleware.locale.LocaleMiddleware', # 开启语言language
'admin_reorder.middleware.ModelAdminReorder', # 开启 admin 后台管理
]
def process_request(self,request) : # 请求刚到来,执行视图之前,权限认证
def process_view(self, request, view_func, view_args, view_kwargs) : # process_request之后,路由转发到视图,执行视图之前
def process_exception(self, request, exception) : # 视图执行中发生异常时
def process_template_response(self,request,response) : # 视图刚执行完毕,process_response之前, 模板渲染时执行
def process_response(self, request, response) : # 视图执行完毕,返回响应时
有函数实现方式和类实现方式(推荐使用类实现方式)
针对类实现方式,举例:
class BookMiddleware:
def __init__(self, get_response):
# 一次性设置和初始化
print('1. 只会在启动项目时执行一次')
self.get_response = get_response # 下一步要执行的操作
def __call__(self, request):
# 视图函数执行前的代码
print('2. 视图函数执行前, process_view执行前的代码')
response = self.get_response(request)
# 视图函数执行后的代码
print('4. 视图函数执行后的代码')
return response
def process_view(self, request, view_func, view_args, view_kwargs):
print("3. 视图函数%s执行前的代码" % view_func.__name__)
def process_exception(self, request, exception):
print("5. 视图函数处理异常")
放在项目APP文件夹内。
例如,新建一个middleware_book.py文档,放置路径是myApp/middleware文件夹内
文档内容,前面有举例。
MIDDLEWARE=[ ] 中添加自定义中间件。
# 例如:
MIDDLEWARE = [
# . . .
'myApp.middleware.middleware_book.BookMiddleware' # 自定义中间件
]