django之(中间件)middleware

中间件

  django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。

  在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件(内置) 

  详细:https://docs.djangoproject.com/en/2.2/ref/middleware/#security-middleware 

1 MIDDLEWARE = [
2     ‘django.middleware.security.SecurityMiddleware‘,
3     ‘django.contrib.sessions.middleware.SessionMiddleware‘,
4     ‘django.middleware.common.CommonMiddleware‘,
5     ‘django.middleware.csrf.CsrfViewMiddleware‘,
6     ‘django.contrib.auth.middleware.AuthenticationMiddleware‘,
7     ‘django.contrib.messages.middleware.MessageMiddleware‘,
8     ‘django.middleware.clickjacking.XFrameOptionsMiddleware‘,
9 ]

  中间件中可以定义五个方法,分别是:

  • process_request(self,request)
  • process_view(self, request, callback, callback_args, callback_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
  • process_response(self, request, response)

  以上方法的返回值可以是None和HttpResonse对象,如果是None,则继续按照django定义的规则向下执行,如果是HttpResonse对象,则直接将该对象返回给用户。

Django的请求生命周期如图:

自定义中间件

创建中间件类

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3
 4 from django.shortcuts import HttpResponse
 5 from django.utils.deprecation import MiddlewareMixin
 6
 7
 8 class M1(MiddlewareMixin):
 9
10     def process_request(self, request):
11         """
12         内部已经帮我们返回
13         如果我们自己加上返回值,在1.1版本前直接在当前中间件的process_response方法返回
14         在1.7 1.8版本后要跳到最后一个中间件的process_response方法一层层的返回
15         :param request:
16         :return:
17         """
18         print(‘m1.process_request‘)
19
20     def process_view(self, request, callback, callback_args, callback_kwargs):
21         """
22         得到当前请求的执行视图函数名字
23         :param request:
24         :param callback:
25         :param callback_args:
26         :param callback_kwargs:
27         :return:
28         """
29         print(‘m1.process_view‘)
30         print(callback)
31         # 如果这里执行callback(就是视图函数的名字)函数,下面每一个中间件的process_view方法都不走了,直接返回执行视图函数的结果
32         # 如果这里不执行callback视图函数方法,那么继续走下面中间件的process_view,如果都没执行(这里又有加装饰器的作用了,\
33         # 如果视图函数要加装饰器,那么这里加上装饰器)再走路由匹配,这样为视图函数巧妙的加上装饰器了
34
35         # response = callback(request, *callback_args, **callback_kwargs)
36         # return response
37
38     def process_response(self, request, response):
39         """
40         在这个环节已经通过了路由系统执行当前请求的视图函数了,一层层的返回字符串给用户
41         :param request:
42         :param response:
43         :return:
44         """
45         print(‘m1.process_response‘)
46         return response
47
48     def process_exception(self, request, exception):
49         print(‘m1.process_exception‘)
50
51     def process_template_response(self, request, response):
52         """
53         视图函数的返回值如果有render方法,才触发这个函数执行
54         :param request:
55         :param response:
56         :return:
57         """
58         print(‘m1.process_template_response‘)
59         return response
60
61
62 class M2(MiddlewareMixin):
63
64     def process_request(self, request):
65         print(‘m2.process_request‘)
66
67     def process_view(self, request, callback, callback_args, callback_kwargs):
68         print(‘m2.process_view‘)
69
70     def process_response(self, request, response):
71         print(‘m2.process_response‘)
72         return response
73
74     def process_exception(self, request, exception):
75         print(‘m2.process_exception‘)

注册中间件

 1 MIDDLEWARE = [
 2     ‘django.middleware.security.SecurityMiddleware‘,
 3     ‘django.contrib.sessions.middleware.SessionMiddleware‘,
 4     ‘django.middleware.common.CommonMiddleware‘,
 5     ‘django.middleware.csrf.CsrfViewMiddleware‘,
 6     ‘django.contrib.auth.middleware.AuthenticationMiddleware‘,
 7     ‘django.contrib.messages.middleware.MessageMiddleware‘,
 8     ‘django.middleware.clickjacking.XFrameOptionsMiddleware‘,
 9     ‘md.M1‘,
10     ‘md.M2‘,
11 ]

 1.路由

urlpatterns = [
    path(‘index/‘, views.index),
]

2.视图

 1 from django.shortcuts import render, HttpResponse
 2
 3
 4 class Foo:
 5     def __init__(self, request, status, message):
 6         self.request = request
 7         self.status = status
 8         self.message = message
 9
10     def render(self):
11         import json
12         result = {
13             ‘status‘: self.status,
14             ‘message‘: self.message
15         }
16         return HttpResponse(json.dumps(result))
17
18
19 def index(request):
20     # print(‘index执行视图函数‘)
21     # return HttpResponse(‘.........‘)
22     return Foo(request, True, "错误信息")

我把几个函数都写在一起分步骤测试的  测试如下图:(正常情况如上图请求生命周期,process_exception和process_template_response如下)  

上图测试的process_exception

总结下process_exception方法触发的机制流程图:

下图是测试process_template_response:

总结下process_template_response:视图函数的返回值如果有render方法,才触发这个函数执行

总结:

     中间件是有序的,从上到小依次执行,本质是因为一个列表

    应用:如果要对请求批量操作的时候就用中间件做

    0.对用户请求缓存中有,我就直接给你,没有就执行视图后续操作(从内存拿数据比从磁盘快多了嘛)

    1.做黑名单

    2.对所有请求日志的记录

    3.做认证权限

    4.装饰器局部使用,全局使用啊

    5.自己也可以做csrf_token认证

      等等很多的看需求

原文地址:https://www.cnblogs.com/Alexephor/p/11272839.html

时间: 2024-10-28 22:46:56

django之(中间件)middleware的相关文章

django之中间件middleware

django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下图. 与mange.py在同一目录下的文件夹 wupeiqi/middleware下的auth.py文件中的Authentication类 中间件中可以定义四个方法,分别是: process_r

django 自定义中间件 middleware

Django 中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性,其它的MVC框架也有这个功能,名称为IoC. Django在中间件中预置了五个方法,这五个方法的区别在于不同的阶段执行,对输入或输出进行干预,方法如下: 1)初始化:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件. def __init__(

Django分析之Middleware中间件

写了几周的脚本,今天终于开始接触web框架了~学习Python的web框架,那么Django就几乎是必修课了,这次的工作是先打打下手,主要的任务是在setting中添加版本号,在渲染静态css,js的路径时附带版本号,例如“example.v1124.css”,然后再在request请求中祛除掉版本号.为什么要这么做呢?因为这样做的话在前端输出静态文件的路径就会加上就会加上版本号,这样当开发出新的静态文件的时候,客户端就会强制刷新本地的缓存,为了达到这个目的就要首先要在settings文件中配置

利用Django中间件middleware解决用户未登录问题(转)

add by zhj: Django的中间件一般用于处理通用性的问题,分为五种,按处理顺序为request_middleware,view_middleware,exception_middleware,template_response_middleware,response_middleware,Django貌似为每种中间件都定义接口,比如request_middleware中间件的接口为process_request(self, request),我们增加新的中间件时,只要实现这些接口就可

Django 详解 中间件Middleware

Django中间件 还是涉及到django的请求生命周期.middle ware 请求穿过中间件到达url,再经过中间件返回给用户. 简单实例 django项目根目录新建一个Middle文件夹,再新建一个test.py文件 在test文件中写入:其中的类必须继承 from django.utils.deprecation import MiddlewareMixin from django.utils.deprecation import MiddlewareMixin class M1(Mid

Django中间件MiddleWare

一.什么是中间件 中间件是一个用来处理Django的请求和响应的框架级别的钩子. 中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法. 我们一直都在使用中间件,只是没有注意到而已,打开Django项目的Settings.py文件,看到下图的MIDDLEWARE配置项. MIDDLEWARE配置项是一个列表,列表中是一个个字符串,这些字符串其实是一个个类,也就是一个个中间件. MIDD

Django 学习之中间件Middleware

一.中间件介绍 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响到性能. Django的中间件官方的定义: Middleware is a framework of hooks into Django’s request/response processing. <br>It’s a light, low-level “plugin” system for g

Django框架之中间件MiddleWare

Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性.我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预. 中间件的原理其实就是定义了一个装饰器,但是这个装饰器可以对整个项目中的所有方法进行装饰: 我们可以通过中间件,对请求对象和响应对象进行相应的干预操作. 实现中间件的流程: 1.在子应用中编写一个middleware.p

django的中间件

这个就是中间件的流程 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下图. 与mange.py在同一目录下的文件夹 wupeiqi/middleware下的auth.py文件中的Authentication类 中间件中可以定义四个方法,分别是