Django 中间件

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

中间件的工作原理

Django 中间件

当用户通过浏览器发送请求到 Django 应用时,Django 会经过一系列步骤来处理这个请求:

  1. 请求到达:用户的 HTTP 请求首先到达 Django 的 WSGI 服务器。
  2. 中间件处理请求:Django 按照配置文件中的顺序调用中间件。这些中间件可以对请求进行操作,比如修改请求内容、添加信息等。
  3. 视图处理请求:如果所有的中间件都没有返回响应,Django 会调用对应的视图函数。
  4. 视图返回响应:视图函数处理请求后返回一个响应对象。
  5. 中间件处理响应:Django 再次按照配置文件中的顺序调用中间件,允许它们对响应进行处理,比如添加 HTTP 头、修改内容等。
  6. 返回给用户:最终响应被发送回用户。

中间件的类型

中间件可以按照其功能分类,常见的中间件包括:

  • 身份验证中间件:处理用户的认证,确保用户是合法的。
  • 会话中间件:管理用户的会话信息,比如登录状态。
  • 跨域资源共享(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!"。

在终端中,你将会看到中间件打印出的日志,包括请求的路径和请求完成后的信息。

Django 中间件

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

Django 中间件

函数式中间件

在 Django 中,除了以类的形式定义中间件(即通过实现 __call__ 方法),还可以使用函数来定义中间件。这个方式使用更简单的函数签名,适合快速实现中间件。

def simple_middleware(get_response):
    # 一次性的配置和初始化

    def middleware(request):
        # 在调用视图之前会执行的代码
        response = get_response(request)  # 调用下一个中间件或视图

        # 在视图调用后会执行的代码
        return response

    return middleware

解释

  1. simple_middleware:这是外部函数,它接受一个 get_response 的参数。这个参数实际上是下一个中间件或者视图的引用。
  2. middleware:这是内嵌的函数,接受当前的请求对象。它会在每个请求时调用。
  3. 执行顺序
    • 当请求到达时,middleware(request) 被调用。这段代码可以在请求到达视图之前执行一些操作。
    • get_response(request) 调用下一个中间件或者实际的视图,生成响应。
    • 在响应返回之前,你可以在回调的 middleware 中执行其他操作(如修改响应)。
    • 最后返回修改后的响应。

发布者:LJH,转发请注明出处:https://www.ljh.cool/43726.html

Like (0)
LJH的头像LJH
Previous 2025年8月7日 下午3:19
Next 2022年9月11日 下午9:24

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注