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

网友投稿 270 2022-08-25


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 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.import HttpResponse def test_mw(request): print("请求到达视图之后输出我") return HttpResponse('测试中间件')

6绑定路由:

urlpatterns = [ path('admin/', admin.site.urls), path('test_mw',views.test_mw),]

7访问浏览器​​development server at the server with CTRL-BREAK.[07/Dec/2021 10:13:05] "GET /test_mw HTTP/1.1" 200 15在请求到达路由之前调用我调用视图之前先调用我请求到达视图之后输出我当前响应返给浏览器之前先调用我,必须返回response


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python如何添加注释?注释有几种?(python怎样加注释)
下一篇:SpringBoot集成mybatis连接oracle的图文教程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~