概念
中间件
中间件(Middleware)是指位于客户端和服务器端之间的一组处理请求和响应的程序。在网络开发中,中间件常用于处理网络请求和响应,以实现一些通用的功能或业务逻辑,例如:路由分发、会话管理、身份认证、日志记录、缓存等。
通常情况下,Web 中间件是一个基于框架的概念,它可以拦截客户端发送过来的请求,对请求进行处理并返回响应,同时也可以对服务器端的响应进行处理。在 Python 中,常见的 Web 框架,如 Flask 和 Django,都提供了中间件机制,让用户可以方便地编写自定义中间件来扩展框架的功能。
中间件的工作原理一般是将请求和响应作为参数传递给一系列的中间件处理函数,然后由这些处理函数依次进行处理,在最后一个中间件处理完请求后,将处理结果返回给客户端。通过这种方式,中间件可以实现不同层级上的处理逻辑,从而完成更复杂的功能。同时,由于多个中间件可以组合成一个责任链(middleware chain),因此中间件还可以根据需要进行添加、修改或删除,以满足不同的业务需求。
中间件是一种可插拔式的、面向切面编程的解决方案,它可以帮助开发人员轻松地扩展框架的功能,并提高代码的可复用性和可维护性。
中间件和装饰器
-
中间件(Middleware)常用于处理 Web 应用程序中的请求和响应,可以对请求和响应进行拦截、处理、修改和增强等操作。Web 框架如 Django 和 Flask 都提供了中间件机制,开发者可以编写自定义中间件来满足不同的需求,例如身份认证、日志记录、缓存等。
-
装饰器(Decorator)则是一种 Python 语言的特性,常用于对函数或类进行修饰,以实现代码的复用和扩展。装饰器可以接受一个或多个函数作为参数,并返回一个包装了原函数的新函数。通常情况下,装饰器可以用于实现函数的缓存、计时、日志记录等功能。
-
中间件和装饰器的区别主要有以下几点:
-
范围不同:中间件一般用于处理 Web 应用程序中的请求和响应,而装饰器则可以用于任何 Python 函数或类,不限于 Web 应用程序。
-
应用场景不同:中间件一般用于实现 Web 应用程序中的类似全局、预处理、后处理等的扩展功能,而装饰器则一般用于实现针对某个函数的特定功能,如修改参数、缓存返回值等。
-
实现方式不同:中间件通常是基于 Web 框架提供的中间件机制实现的,而装饰器则是基于 Python 语言的特性实现的。
-
Django的中间件
- 中间件处理顺序
- 初始化顺序:由下到上
- 接收请求(视图处理前):由上到下
- 返回响应(视图处理后):由下到上
- 中间件调用
- 初始化:只在第一次配置和初始化时执行一次
- 中间件处理函数-每次请求时都会被调用
- 功能上类似装饰器。区别中间件是全局生效的,装饰器局部生效
代码
test01.middleware.py
"""
中间件处理顺序
初始化顺序:由下到上
视图处理前:由上到下
视图处理后:由下到上
中间件调用
初始化:只在第一次配置和初始化时执行一次
中间件处理函数-每次请求时都会被调用,功能上类似装饰器。区别中间件是全局生效的,装饰器局部生效
"""
def my_middleware1(get_response):
# # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次
print('my_middleware1的init 被调用')
def middleware(request):
# # 此处编写的代码会在每个请求处理视图前被调用
print('my_middleware1的before request 被调用')
response = get_response(request)
# 此处编写的代码会在每个请求处理视图之后被调用
print('my_middleware1的after response 被调用')
return response
return middleware
def my_middleware2(get_response):
# # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次
print('my_middleware2的init 被调用')
def middleware(request):
# # 此处编写的代码会在每个请求处理视图前被调用
print('my_middleware2的before request 被调用')
response = get_response(request)
# 此处编写的代码会在每个请求处理视图之后被调用
print('my_middleware2的after response 被调用')
return response
return middleware
settings.py
view.py
from django import http
from django.shortcuts import render
# Create your views here.
def middleware(request):
print('view 视图被调用')
return http.HttpResponse('OK')
输出结果