django中间件
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',
]
'''
什么时候用:全局相关功能时。
用户访问频率校验:中间件查看IP,计算访问频率。
什么是用户权限?
在web领域中权限就是url vip才能访问某个url
没有访问某网址的权限只能买vip,
服务器给这个账号添加可以访问的路由 也就是添加权限
'''
django用字符串的形式导模块:
查看源码发现,这些中间件都继承MiddlewareMixin
,并且基本上都有process_request
、process_response
方法:
自定义中间件
如何自定义中间件
1.创建存储自定义中间件代码的py文件或者目录(如果中间件很多)
2.参考自带中间件的代码编写类并继承
3.在类中编写五个可以自定义的方法
需要掌握的
process_request
1.请求来的时候会从上往下依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过
2.如果该方法自己返回了HttpResponse对象那么不再往后执行而是直接原路返回
process_response
1.响应走的时候会从下往上依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过
2.该方法有两个先request和response 形参response指代的就是后端想要返回给前端浏览器的数据 该方法必须返回该形参 也可以替换
'''如果在执行process_request方法的时候直接返回了HttpResponse对象那么会原路返回执行process_response 不是执行所有'''
需要了解的
process_view
process_exception
process_template_response
4.一定在配置文件中注册中间件才可以生效
django支持自定义中间件,自定义中间件中支持定义五个方法。process_request
、process_response
方法也都支持自定义。
1.创建存储自定义中间件代码的py文件或者目录(如果中间件很多)
2.参考自带中间件的代码编写类并继承
3.在类中编写五个可以自定义的方法
需要掌握的:
process_request
process_response
需要了解的:
process_view
process_exception
process_template_response
从上往下重要程度依次降低。
中间件要在settings注册之后才能生效:
process_request
当向服务端发送请求,请求的途径路线及顺序:
请求来的时候 会从上往下依次经过每个中间件的 process_request方法。
当这些process_request方法全部执行完,才能进入路由层,进入视图层。
中间件中,也能获取到request对象的所有数据:
可以进行各种操作,添加逻辑等。
如果process_request方法自己返回了Httpresponse对象。
就会让请求原路返回,不能继续进入下一个中间件。
process_response
process_response需要两个形参:request
、response
并且如果形参里携带response就必须要把这个responce返回。
请求来了之后查看执行顺序:
响应走的时候会从下往上依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过。
形参response指代的就是后端想要返回给前端浏览器的数据。后端发送的数据,会赋值给中间件的response。如果某个中间件不返回response,后面的中间件也就拿不到response,最后服务器也不会返回响应。
可以在中间件玩狸猫换太子:
在中间件进行一些额外的操作,修改后端返回的数据,也就是用中间件的response代替视图函数的HttpResponse。
特殊情况:
请求经过process_request方法时,process_request直接拒绝该请求,不让其进入下一个中间件。那此时响应会如何发送回客户端?
中间件响应的返回方式
两种方式:
1.执行拒绝该请求的中间件的process_response,以及上面中间件的process_response
2.执行所有的process_response
这个操作在不同的框架里是不一样的。
在django里面是第一种方式:
在中间件001被拒绝,就从中间件001的process_response返回:
基于当前中间件的process_response原路返回
对于flask会执行所有中间件的process_response。