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

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 response

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

 

 

posted @ 2021-12-07 10:40  linuxTang  阅读(359)  评论(0)    收藏  举报