Django的中间件
Django 中间件是 Django 中的门户
Django 支持程序员 自定义中间件 并且暴露给程序员五个可以自定义的方法
- 请求来的时候 需要经过中间件 才能真正到达 Django 后端
- 相应走的时候也需要经过默认的七个中间件才能发送出去
研究djangol中间件代码规律
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',
from django.contrib.sessions.middleware import SessionMiddleware
- 必须掌握
process_request
process_response
- 了解即可
process_view
路由匹配成功之后执行视图函数之前 会自动执行中间件里面的该方法
顺序是按照配置文件中注册的中间件从上往下的顺序依次执行
process_tmplate_response
返回的是 HttpResponse 对象中有 render 属性才会触发
顺序是按照配置文件注册的中间件 从上往下
process_exception
当视图函数中出现异常的情况下 出发
顺序如上
如何自定义中间件
1.在项目名或者应用名下创建一个任意名称的文件夹
2.在该文件夹内创建一个任意名称的py文件
3.在该py文件内需要书写类(这个类必须继承MiddlewareMixin)
然后在这个类里面就可以自定义五个方法了
(这五个方法并不是全部都需要书写,用几个写几个)
4.需要将类的路径以字符串的形式注册到配置文件中才能生效
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',
·你自己写的中间件的路径1',
'你自己写的中间件的路径2',
'你自己写的中间件的路径3引',
必掌握
- process_requset
- 请求俩的时候需要经过每一个中间件里面的 process_request 方法
结果的顺序是按照配置文件中注册的中间件从上往下的顺序依次执行 - 如果中间件中没有定义改方法 那么直接跳过执行下一个中间件
- 如果改方法返回了 HttpResponse 对象 那么请求将不再继续往后执行 而是直接原路返回(检验失败不允许访问)
process_response 方法就是用来做全局相关的所有限制功能
- process_response
- 相应走的时候 需要经过每一额中间件中的 process_response 方法
有两个额外的参数 request,response
response 是后端想要传给前段的数据 - 该方法必须要返回一个 HttpResponse 对象
- 默认返回的是行参 response
- 你也可以直接返回自己的内容 不过这同样会导致 原本的页面被替换
- 顺序是按照配置文件中注册了的中间件从下往上依次经过
如果没有定义的情况直接跳过执行下一个
process_request
from django.utils.deprecation import MiddlewareMixin
class MyMiddleware1(MiddlewareMixin):
def process_request(self,request):
print('我是第一个自定义中间件里面的process_request方法')
class MyMiddleware2(MiddlewareMixin):
def process_request(self,request):
print('我是第二个自定义中间件里面的process_request方法')
process_response
def process_response(self,request,response):
print('我是第一个自定义中间件里面的oro cess_-response;方法')
return HttpResponse("hello world!")
问题探讨
研究如果在第一个process_request方法就已经返回了HttpResponse对象
那么响应走的时候是经过所有的中间件里面的process_response 还是有其他情况
是其他情况 就是会直接走同级别的process_reponse返回
flask框架也有一个中间件但是它的规律
只要返回了一个对象了就必须经过所有中间件里面的类似于process_reponse方法
研究如果在第一个 process_request 还是有其它情况