在 Django 中,中间件是一个处理请求和响应的钩子框架。中间件是一系列组件,可以在 Django 的处理请求和响应的过程中插入,以便对请求、响应、异常等进行处理或者修改。它们可以被视为在 Django 的 request-response 循环中的一个“过滤器”。
中间件的工作原理

当用户通过浏览器发送请求到 Django 应用时,Django 会经过一系列步骤来处理这个请求:
- 请求到达:用户的 HTTP 请求首先到达 Django 的 WSGI 服务器。
- 中间件处理请求:Django 按照配置文件中的顺序调用中间件。这些中间件可以对请求进行操作,比如修改请求内容、添加信息等。
- 视图处理请求:如果所有的中间件都没有返回响应,Django 会调用对应的视图函数。
- 视图返回响应:视图函数处理请求后返回一个响应对象。
- 中间件处理响应:Django 再次按照配置文件中的顺序调用中间件,允许它们对响应进行处理,比如添加 HTTP 头、修改内容等。
- 返回给用户:最终响应被发送回用户。
中间件的类型
中间件可以按照其功能分类,常见的中间件包括:
- 身份验证中间件:处理用户的认证,确保用户是合法的。
- 会话中间件:管理用户的会话信息,比如登录状态。
- 跨域资源共享(CORS):处理跨域请求的问题。
- 压缩中间件:可以压缩返回的响应数据以减小数据传输量。
- 错误处理:捕获异常并返回相应的错误消息。
创建自定义中间件
如果默认的中间件无法满足你的需求,你可以创建自己的中间件。下面是一个简单的自定义类中间件的示例:
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# 初始化代码,运行一次
def __call__(self, request):
# 代码在视图处理请求之前执行
print("请求到达")
response = self.get_response(request)
# 代码在视图处理请求之后执行
print("响应返回")
return response
使用中间件
要使用中间件,你需要在 Django 设置文件 settings.py
的 MIDDLEWARE
列表中添加你的中间件类:
MIDDLEWARE = [
...
'myapp.middleware.SimpleMiddleware', # 添加你的中间件
...
]
简单的 Django 项目示例
创建一个新的 Django 应用
django-admin startapp myapp
将 myapp
添加到 INSTALLED_APPS
INSTALLED_APPS = [
...
'myapp',
]
创建简单的视图
在 myapp/views.py
中,创建一个简单的视图:
from django.http import HttpResponse
def home(request):
return HttpResponse("Hello, welcome to my site!")
配置 URL
在 myapp/urls.py
中,配置路由将请求导向刚才创建的视图:
from django.urls import path
from .views import home
urlpatterns = [
path('', home, name='home'),
]
然后在 project/urls.py
中引用应用的 URLconf:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('myapp/', include('myapp.urls')), # 引入 myapp 的 urls.py
]
创建自定义中间件
class SimpleMiddleware:
def __init__(self, get_response):
# 在中间件初始化时,Django 会传入 get_response,这是一个可调用对象。
self.get_response = get_response
# 初始化代码,可以在这里进行一些必要的准备工作,例如配置或日志记录。
def __call__(self, request):
# 当请求到达时,Django 会调用这个方法,并传入请求对象。
print("请求到达前")
# 记录请求信息,输出请求的路径,便于调试和监视。
print(f"请求路径: {request.path}")
# 调用下一个中间件或最终的视图函数,并传递请求对象。
# 这将返回一个响应对象。
response = self.get_response(request)
# 日志或其他操作可以在这里执行,表明请求已经被处理完成。
print("请求完成后")
# 对响应进行一些操作,例如可以添加自定义的 HTTP 头信息。
response['X-Extra-Header'] = 'Some Value'
# 返回处理后的响应对象,这个响应可能已经被修改过。
return response
配置中间件
在 project/settings.py
中,找到 MIDDLEWARE
部分,并添加你的中间件:
MIDDLEWARE = [
...
'myapp.middleware.SimpleMiddleware', # 加入自定义中间件
...
]
运行项目
现在你可以运行你的 Django 项目:
python manage.py runserver
访问应用
打开一个浏览器,访问 http://127.0.0.1:8000/myapp
,页面上显示 "Hello, welcome to my site!"。
在终端中,你将会看到中间件打印出的日志,包括请求的路径和请求完成后的信息。

此外,HTTP 响应中会增加一个自定义头 X-Extra-Header

函数式中间件
在 Django 中,除了以类的形式定义中间件(即通过实现 __call__
方法),还可以使用函数来定义中间件。这个方式使用更简单的函数签名,适合快速实现中间件。
def simple_middleware(get_response):
# 一次性的配置和初始化
def middleware(request):
# 在调用视图之前会执行的代码
response = get_response(request) # 调用下一个中间件或视图
# 在视图调用后会执行的代码
return response
return middleware
解释
simple_middleware
:这是外部函数,它接受一个get_response
的参数。这个参数实际上是下一个中间件或者视图的引用。middleware
:这是内嵌的函数,接受当前的请求对象。它会在每个请求时调用。- 执行顺序:
- 当请求到达时,
middleware(request)
被调用。这段代码可以在请求到达视图之前执行一些操作。 get_response(request)
调用下一个中间件或者实际的视图,生成响应。- 在响应返回之前,你可以在回调的
middleware
中执行其他操作(如修改响应)。 - 最后返回修改后的响应。
- 当请求到达时,
发布者:LJH,转发请注明出处:https://www.ljh.cool/43726.html