1什么是中间件 改变全局请求和响应的插件叫中间件,在django中,中间件以类的形式体现,中间件类必须要继承django.utils.deprecation.MiddlewareMixin类 2编写中间件类 定义中间件至少需要实现
1什么是中间件
改变全局请求和响应的插件叫中间件,在django中,中间件以类的形式体现,中间件类必须要继承django.utils.deprecation.MiddlewareMixin类
2编写中间件类
定义中间件至少需要实现下列方法中的一种:
process_request(self, request)
process_request(self, request)执行路由之前被调用,在每个请求上调用,返回None或HttpResponse对象,适用于ip地址的过滤
process_view(self,request,callback,callback_args,callback_kwargs)
process_view(self,request,callback,callback_args,callback_kwargs)调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
callback:视图函数
callback_args:关键字传参
callback_kwargs:位置传参
process_response(self,request,response)
process_response(self,request,response)当前这个response响应返回给浏览器之前会被调用,它必须要返回一个值HttpResponse对象
process_exception(self,request,exception)
process_exception(self,request,exception)当处理过程中抛出异常时调用,返回一个HttpResponse对象
3多个中间件的执行顺序
django中间件的执行顺序是:在进入视图函数之前,中间件按照注册顺序由上至下执行,但是一旦从视图函数出来,在视图函数之后执行的中间件都是从下到上的注册顺序调用的
4示例练习:
1在项目目录下创建一个python包:middleware:
右键mysite7 -- New -- python Package
mysite7middleware
__init__.py
mysite7
__init__.py
asgi.py
settings.py
urls.py
views.py
wsgi.py
manage.py
2在python包middleware中创建一个python文件mymiddleware.py
mysite7middleware
__init__.py
mymiddleware.py
mysite7
__init__.py
asgi.py
settings.py
urls.py
views.py
wsgi.py
manage.py
3在mymiddleware.py内编写中间件:
from django.utils.deprecation import MiddlewareMixinclass MyMW(MiddlewareMixin):
def process_request(self,request):
print('在请求到达路由之前调用我')
def process_view(self,request,callback,callback_args,callback_kwargs):
print('调用视图之前先调用我')
def process_response(self,request,response):
print('当前响应返给浏览器之前先调用我,必须返回response')
return
4在setting.py里注册中间件:
MIDDLEWARE = ['middleware.mymiddleware.MyMW',
]
5编写测试视图:
from django.http import HttpResponsedef test_mw(request):
print("请求到达视图之后输出我")
return HttpResponse('测试中间件')
6绑定路由:
urlpatterns = [path('admin/', admin.site.urls),
path('test_mw',views.test_mw),
]
7访问浏览器http://127.0.0.1:8000/test_mw:
浏览器页面显示的内容是:测试中间件8在pycharm里查看执行过程:
Starting development server at http://127.0.0.1:8000/Quit the server with CTRL-BREAK.
[07/Dec/2021 10:13:05] "GET /test_mw HTTP/1.1" 200 15
在请求到达路由之前调用我
调用视图之前先调用我
请求到达视图之后输出我
当前响应返给浏览器之前先调用我,必须返回response