当前位置 : 主页 > 编程语言 > python >

26Django中间件的编写和执行顺序

来源:互联网 收集:自由互联 发布时间:2022-07-13
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

mysite7
middleware
__init__.py
mysite7
__init__.py
asgi.py
settings.py
urls.py
views.py
wsgi.py
manage.py

2在python包middleware中创建一个python文件mymiddleware.py

mysite7
middleware
__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 MiddlewareMixin

class 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 HttpResponse

def 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

 

 



上一篇:Python如何添加注释?注释有几种?
下一篇:没有了
网友评论