django之中间件

Django 中间件是一个轻量级的、底层的插件系统,用于全局地处理请求和响应。中间件可以用于各种任务,如请求和响应的处理、用户认证、缓存、会话管理等。

Django 默认的中间件配置

settings.py 中,Django 默认的中间件配置如下:

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. django.middleware.security.SecurityMiddleware

作用

  • 提供了一些安全增强功能,如设置 HTTP 头部来防止某些类型的攻击。
  • 可以配置 SECURE_* 设置来启用 HTTPS、HSTS 等安全功能。

具体功能

  • 设置 Strict-Transport-Security 头部,启用 HTTP 严格传输安全(HSTS)。
  • 设置 X-Content-Type-Options 头部,防止浏览器 MIME 类型嗅探。
  • 设置 X-XSS-Protection 头部,启用浏览器的 XSS 过滤。
  • 设置 Content-Security-Policy 头部,防止跨站脚本攻击(XSS)。
2. django.contrib.sessions.middleware.SessionMiddleware

作用

  • 管理用户会话,使用 cookies 来存储会话 ID。
  • 在请求对象上添加 request.session 属性,用于访问和修改会话数据。

具体功能

  • 处理会话的创建、读取和保存。
  • 支持多种会话后端,如数据库、缓存、文件等。
3. django.middleware.common.CommonMiddleware

作用

  • 提供了一些常见的功能,如 URL 规范化(去除 URL 末尾的斜杠或添加斜杠)。
  • 可以配置 APPEND_SLASHPREPEND_WWW 设置。

具体功能

  • 根据 APPEND_SLASH 设置,自动为缺少斜杠的 URL 添加斜杠。
  • 根据 PREPEND_WWW 设置,自动为 URL 添加 www 前缀。
  • 处理一些常见的 HTTP 头部,如 Content-LengthContent-Type
4. django.middleware.csrf.CsrfViewMiddleware

作用

  • 提供 CSRF(跨站请求伪造)保护。
  • 在请求对象上添加 request.csrf_processing_done 属性,用于标记 CSRF 处理状态。

具体功能

  • 检查 POST 请求中的 CSRF 令牌,防止跨站请求伪造攻击。
  • 在响应中设置 CSRF 令牌 cookie。
5. django.contrib.auth.middleware.AuthenticationMiddleware

作用

  • 关联用户和请求,使用会话来获取用户信息。
  • 在请求对象上添加 request.user 属性,用于访问当前登录的用户。

具体功能

  • 处理用户的身份验证。
  • 支持多种身份验证后端,如数据库、LDAP、OAuth 等。
6. django.contrib.messages.middleware.MessageMiddleware

作用

  • 提供临时消息存储,用于在请求之间传递消息。
  • 在请求对象上添加 request._messages 属性,用于访问消息存储。

具体功能

  • 处理消息的创建、读取和保存。
  • 支持多种消息存储后端,如会话、缓存等。
7. django.middleware.clickjacking.XFrameOptionsMiddleware

作用

  • 提供点击劫持保护,通过设置 X-Frame-Options HTTP 头部。
  • 防止网页被嵌入到 <iframe> 中,保护用户免受点击劫持攻击。

具体功能

  • 设置 X-Frame-Options 头部为 DENYSAMEORIGIN,防止网页被嵌入到 <iframe> 中。
执行顺序
  • 请求顺序:从上到下依次执行。
  • 响应顺序:从下到上依次执行。

自定义中间件

1. 创建中间件类

在 Django 应用中创建一个新的 Python 文件,例如 myapp/middleware.py,并定义一个中间件类。

# myapp/middleware.py

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

2. 注册中间件

settings.py 中注册你的中间件类。

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',
    'myapp.middleware.SimpleMiddleware',  # 注册自定义中间件
]

自定义中间件类的方法

自定义中间件类可以实现以下方法来处理请求和响应:

  1. process_request(self, request): 在视图处理请求之前调用。
  2. process_response(self, request, response): 在视图处理请求之后调用。
  3. process_view(self, request, view_func, view_args, view_kwargs): 在视图函数调用之前调用。
  4. process_exception(self, request, exception): 在视图函数抛出异常时调用。
# myapp/middleware.py

class CustomMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 在视图处理请求之前执行的代码
        self.process_request(request)

        response = self.get_response(request)

        # 在视图处理请求之后执行的代码
        response = self.process_response(request, response)

        return response

    def process_request(self, request):
        print("处理请求之前")

    def process_response(self, request, response):
        print("处理请求之后")
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        print("视图函数调用之前")
        return None

    def process_exception(self, request, exception):
        print("视图函数抛出异常")
        return None
process_request(self, request)

参数

  • self: 中间件实例。
  • request: 一个 HttpRequest 对象,表示当前的请求。

作用

  • 在视图处理请求之前调用。
  • 可以用于修改请求对象或进行预处理操作。

返回值

  • 如果返回 None,Django 将继续处理请求,调用下一个中间件或视图。
  • 如果返回一个 HttpResponse 对象,Django 将直接返回这个响应,不再调用后续的中间件和视图。

示例

def process_request(self, request):
    print("处理请求之前")
    # 可以在这里添加自定义逻辑
    return None
process_response(self, request, response)

参数

  • self: 中间件实例。
  • request: 一个 HttpRequest 对象,表示当前的请求。
  • response: 一个 HttpResponse 对象,表示视图返回的响应。

作用

  • 在视图处理请求之后调用。
  • 可以用于修改响应对象或进行后处理操作。

返回值

  • 必须返回一个 HttpResponse 对象,通常是传入的 response 对象,可能经过修改。

示例

def process_response(self, request, response):
    print("处理请求之后")
    # 可以在这里添加自定义逻辑
    return response
process_view(self, request, view_func, view_args, view_kwargs)

参数

  • self: 中间件实例。
  • request: 一个 HttpRequest 对象,表示当前的请求。
  • view_func: 将被调用的视图函数。
  • view_args: 传递给视图函数的位置参数。
  • view_kwargs: 传递给视图函数的关键字参数。

作用

  • 在视图函数调用之前调用。
  • 可以用于修改视图函数或其参数,或者进行预处理操作。

返回值

  • 如果返回 None,Django 将继续处理请求,调用视图函数。
  • 如果返回一个 HttpResponse 对象,Django 将直接返回这个响应,不再调用视图函数。

示例

def process_view(self, request, view_func, view_args, view_kwargs):
    print("视图函数调用之前")
    # 可以在这里添加自定义逻辑
    return None
process_exception(self, request, exception)

参数

  • self: 中间件实例。
  • request: 一个 HttpRequest 对象,表示当前的请求。
  • exception: 视图函数抛出的异常。

作用

  • 在视图函数抛出异常时调用。
  • 可以用于处理异常,记录日志,或者返回自定义的错误响应。

返回值

  • 如果返回 None,Django 将继续处理异常,调用下一个异常处理中间件或默认的异常处理机制。
  • 如果返回一个 HttpResponse 对象,Django 将直接返回这个响应,不再调用后续的异常处理中间件。

示例

def process_exception(self, request, exception):
    print("视图函数抛出异常")
    # 可以在这里添加自定义逻辑
    return None

MiddlewareMixin

在 Django 中,自定义中间件不一定需要继承 MiddlewareMixin,但在某些情况下,继承 MiddlewareMixin 可以简化中间件的编写,特别是当你需要实现 process_requestprocess_responseprocess_viewprocess_exception 方法时。

MiddlewareMixin 是 Django 提供的一个混入类,用于简化中间件的编写。它提供了默认的 __call__ 方法实现,使得你可以只实现你需要的方法,而不必自己处理请求和响应的传递。

使用 MiddlewareMixin
# myapp/middleware.py

from django.utils.deprecation import MiddlewareMixin

class CustomMiddleware(MiddlewareMixin):
    def process_request(self, request):
        print("处理请求之前")

    def process_response(self, request, response):
        print("处理请求之后")
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        print("视图函数调用之前")
        return None

    def process_exception(self, request, exception):
        print("视图函数抛出异常")
        return None

settings.py 中注册这个中间件:

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',
    'myapp.middleware.CustomMiddleware',  # 注册自定义中间件
]
不使用 MiddlewareMixin

如果不想使用 MiddlewareMixin,需要自己实现 __call__ 方法来处理请求和响应的传递。

# myapp/middleware.py

class CustomMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 在视图处理请求之前执行的代码
        response = self.process_request(request)
        if response:
            return response

        response = self.get_response(request)

        # 在视图处理请求之后执行的代码
        response = self.process_response(request, response)

        return response

    def process_request(self, request):
        print("处理请求之前")
        return None

    def process_response(self, request, response):
        print("处理请求之后")
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        print("视图函数调用之前")
        return None

    def process_exception(self, request, exception):
        print("视图函数抛出异常")
        return None

settings.py 中注册这个中间件:

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',
    'myapp.middleware.CustomMiddleware',  # 注册自定义中间件
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼爱吃火锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值