中间介(MiddleWare)

作者:@skyflask
转载本文请注明出处:https://www.cnblogs.com/skyflask/p/9823498.html


目录

 引子-Django的生命周期
自定义中间介
1、自定义中间介
2、setttings文件配置
3、视图函数
4、urls.py文件
5、访问URL
MiddlewareMixin函数
源码
总结
中间介整体执行流程
中间介应用场景
最常用的方法

 引子-Django的生命周期

在学习中间介之前,我们先来回顾一下Django的生命周期:用户发起请求,请求会被发送到urlconf中的url,然后会指向对应的views函数进行处理,views函数处理完成后,用模板渲染好html,然后返回给用户的浏览器。

加上中间介的流程如下:

在Django中的setttings文件有配置middleware

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

执行顺序从上到下。

自定义中间介

1、自定义中间介

新建一个名为middle的包,下面新建文件md.py,

内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from django.utils.deprecation import MiddlewareMixin
 
class MD1(MiddlewareMixin):
    def process_request(self,request):
        print "MD1 process_request"
 
    def process_response(self,request,response):
        print "MD1 process_response"
        return response
 
 
class MD2(MiddlewareMixin):
    def process_request(self,request):
        print "MD2 process_request"
 
    def process_response(self,request,response):
        print "MD2 process_response"
        print response
        return response

  

2、setttings文件配置

MIDDLEWARE新增中间介配置:

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

  

3、视图函数

views.py

1
2
3
def md(request):
    print "views function"
    return HttpResponse('execute view function')

  

4、urls.py文件

1
2
3
4
5
6
7
8
9
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', views.index),
    url(r'^mf/', views.mf),
    url(r'^fm/', views.fm),
    url(r'^myform/', views.myform),
    url(r'md',views.md),
 
]

 

5、访问URL

浏览器返回视图函数的内容:

后台执行:

中间介依次执行,

MD1的process_request,MD2的process_request
MD2的process_response,MD1的process_response

中间介的response值为视图函数的返回值。

 

 

 

 

1
2
3
4
5
6
7
8
class MD1(MiddlewareMixin):
    def process_request(self,request):
        print "MD1 process_request"        #process_request函数有返回值时,会直接返回给用户,而不往下执行。
        return HttpResponse('MD1 process_request')
 
    def process_response(self,request,response):
        print "MD1 process_response"
        return response

  

执行结果为:

 

多个middleware的整体执行流程如下:

 

 

MiddlewareMixin函数

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class MiddlewareMixin(object):
    #构造函数执行父类的构造函数
    def __init__(self, get_response=None):
        self.get_response = get_response
        super(MiddlewareMixin, self).__init__()
 
    def __call__(self, request):
        response = None
        #如果当前中间介有process_request方法,则执行
        if hasattr(self, 'process_request'):
            response = self.process_request(request)
        #如果当前中间介没有process_request方法,则执行下一个中间介的__call__(),依次循环执行下去
        if not response:
            response = self.get_response(request)
        #执行当前中间介的process_reponse方法
        if hasattr(self, 'process_response'):
            response = self.process_response(request, response)
        return response

  7、8、9版本里面process_request和process_response方法都是必须写的,10版本以后可以不写,但是为了过渡,最好写上。

 每个中间介,可能只有process_request,也可能只有process_response方法。

 

总结

中间介整体执行流程

 

中间介应用场景

对于所有的用户统一的请求都需要处理,这时就需要中间介可以搞定,如果是部分用户请求,可以用装饰器进行处理。

csrf是通过判断request的header里面是否有csrf参数。

 

最常用的方法

process_request

因为process_request方法可以在用户请求时,做统一的操作非常方便、灵活,比如设置白名单。

 

posted @   skyflask  阅读(460)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
历史上的今天:
2017-10-20 python的super函数学习
点击右上角即可分享
微信分享提示