如何确定26Django中间件的编写与执行先后顺序?

2026-05-21 19:521阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计737个文字,预计阅读时间需要3分钟。

如何确定26Django中间件的编写与执行先后顺序?

中间件是一种修改全局请求和响应流程的插件。在Django中,中间件以类的形式实现,通常继承自`django.utils.deprecation.MiddlewareMixin`类。以下是一个简单的中间件类编写示例:

pythonfrom django.utils.deprecation import MiddlewareMixin

class MyMiddleware(MiddlewareMixin): def process_request(self, request): # 在请求处理之前执行 print(请求处理之前)

def process_response(self, request, response): # 在响应返回之前执行 print(响应返回之前) return response

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:

如何确定26Django中间件的编写与执行先后顺序?

右键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.127.0.0.1:8000/test_mw​​:

浏览器页面显示的内容是:测试中间件

8在pycharm里查看执行过程:

Starting development server at 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



本文共计737个文字,预计阅读时间需要3分钟。

如何确定26Django中间件的编写与执行先后顺序?

中间件是一种修改全局请求和响应流程的插件。在Django中,中间件以类的形式实现,通常继承自`django.utils.deprecation.MiddlewareMixin`类。以下是一个简单的中间件类编写示例:

pythonfrom django.utils.deprecation import MiddlewareMixin

class MyMiddleware(MiddlewareMixin): def process_request(self, request): # 在请求处理之前执行 print(请求处理之前)

def process_response(self, request, response): # 在响应返回之前执行 print(响应返回之前) return response

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:

如何确定26Django中间件的编写与执行先后顺序?

右键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.127.0.0.1:8000/test_mw​​:

浏览器页面显示的内容是:测试中间件

8在pycharm里查看执行过程:

Starting development server at 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