Django--中间件

Posted staff

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django--中间件相关的知识,希望对你有一定的参考价值。

执行流程: 

技术图片

 

全局性的逻辑处理部分
介于request和response之间的处理程序
settings.py里的MIDDLEWARE就是中间件,有七个

请求先到wsgiref被封装成request,
再到中间件,共七个
按顺序执行每个中间件的process_request()方法
从中间件出去后到了路由层,路由分发给相应的视图函数
处理完后
顺序执行中间件的process_response()方法
然后到了wsgiref,封装响应,交给浏览器


自定义属于自己的中间件:
在app01里新建my_middlewares.py
加到settings.py里的MIDDLEWARE
"app01.my_middlewares.CustomerMiddleware"

from django.utils.deprecation import MiddlewareMixin
class CustomerMiddleware(MiddlewareMixin):
def process_request(self,request):
print(‘request.....‘)
#return HttpResponse("forbitton") 如果写这个就会拦截浏览器请求
def process_response(self, request, response):
print(‘response...‘)
return response #不响应要报错
# 加这个后执行完中间件会依次执行这个
# callback是路由对应的视图函数,callback_args是视图函数的参数
def process_view(self, request,callback, callback_args, callback_kwargs):
# 下面这相当于执行对应的视图函数,得到响应再返回,就拦截了
# response = callback(callback_args,callback_kwargs)
# return response
print(‘process_view....‘)
# 不出错不会执行这个,出错会依次执行中间件的这个,直到有中间件返回响应
def process_exception(self,request,exception):
print(‘process_exception...‘)
return HttpResponse(exception)

针对大多数视图要做的事情可以放在中间件里去做
例如校验是否登录,登录就执行视图函数。
例如限制一分钟内只能访问服务器20次,否则就屏蔽

掌握:
1、process_request(self, request):中间件访问时执行的方法
2、process_response(self, request, response):中间件响应的时候执行的方法
3、执行流程
了解:
process_view
process_exception

 

中间件的应用案例:

1、做IP访问频率限制
某些IP访问服务器的频率过高,进行拦截,比如限制每分钟不能超过20次
2、URL访问过滤
如果用户访问的是login视图(放过)
如果访问其他视图,要检测是否有session认证,已经有了就放行,没有就返回login,
这样就省得在多个视图函数上写装饰器了

先在settings.py里定义白名单:WHITE_LIST[‘login/‘,‘reg/‘,‘logout/‘]
class AuthMiddleware(MiddlewareMixin):
def process_request(self,request):
white_list = settings.WHITE_LIST
if request.path in white_list:
return None # 结束这个方法
if not request.user.is_authenticated:
return redirect("/login/")

情况一:

process_request里写return HttpResponse(..) 请求被拦截。见下图所示

技术图片

情况二:

中间件里写了process_view(self, request,callback, callback_args, callback_kwargs)方法:

技术图片

情况三:

技术图片

 

以上是关于Django--中间件的主要内容,如果未能解决你的问题,请参考以下文章

Django学习之七:Django 中间件

Django中间件

Django中间件

Django之中间件

17_django中间件的使用

Django----中间件详解