详解django自定义中间件处理

yizhihongxing

当我们使用 Django 时,它通常会根据请求接收到的HTTP头文件(Headers),响应一个HttpResponse对象。但是,我们可能希望在web应用程序的处理请求和响应过程中添加自己的代码逻辑。这时,中间件的概念就出现了。

什么是中间件

中间件是在请求和响应过程中,在Django框架处理请求和响应对象之间执行的可重用组件。中间件可以拦截请求、修改请求、拦截响应或修改响应。可以添加、修改HTTP头文件,过滤请求和响应等等操作。

Django中间件一般都是一个类,并且至少需要实现以下三个方法的其中一个:

  1. process_request(self, request)方法:这个方法在视图函数执行前被调用。返回None或HttpResponse对象。HttpResponse对象会中断请求,否则进入下一个中间件。

  2. process_view(self, request, view_func, view_args, view_kwargs)方法:这个方法在视图函数执行前被调用。返回None 或其他HttpResponse对象。

  3. process_response(self, request, response)方法:这个方法在视图函数返回HttpResponse对象后被调用。返回HttpResponse对象.

编写自定义中间件

步骤如下:

  1. 在Django项目根目录创建名为middlewares的文件夹。

  2. 在该文件夹下创建一个名为middlewares.py的文件,定义自己的中间件类(比如: CheckUserMiddleware)。

    ```
    from django.http import HttpResponse

    class CheckUserMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response
    
    def __call__(self, request):
        if request.user.is_authenticated:
            response = self.get_response(request)
            return response
        else:
            return HttpResponse("您还未登录,无法访问此页面。")
    

    ```

  3. 在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',
    'middlewares.CheckUserMiddleware', # 添加自定义中间件
    ]

如上代码,自定义中间件CheckUserMiddleware 会拦截请求并返回一个HttpResponse对象,如果条件判断符合,则继续执行到视图函数,否则直接返回一个字符串。

示例

示例一:计算请求处理时间

import time
from django.utils.deprecation import MiddlewareMixin


class TimingMiddleware(MiddlewareMixin):

    def process_request(self, request):
        request.start_time = time.time()

    def process_response(self, request, response):
        response.add_header("X-Total-Time", time.time() - request.start_time)
        return response

在 process_request 方法中,记录请求处理开始时间。在 process_response 中,计算处理请求总共的时间并写入响应头中。

示例二:防止CSRF攻击

from django.middleware.csrf import CsrfViewMiddleware
from django.http import HttpResponseForbidden


class CsrfMiddleware(CsrfViewMiddleware):

    def process_view(self, request, callback, callback_args, callback_kwargs):
        if request.is_ajax():
            return self._reject(request, REASON_NO_CSRF_COOKIE)
        return super(CsrfMiddleware, self).process_view(request, 
            callback, callback_args, callback_kwargs)

    def _reject(self, request, reason):
        if request.is_ajax():
            return HttpResponseForbidden(reason)
        return super(CsrfMiddleware, self)._reject(request, reason)

在这个中间件中,我们覆盖了父类中的 process_view 方法,用于判断是否只允许 Ajax 请求,如果是 Ajax 请求(request.is_ajax()),返回一个 HttpResponseForbidden 的响应,否则继续使用父类的默认方法进行CSRF请求验证。

这样就能在响应中添加 CSRF Token,避免POST请求被中间人攻击。

以上是对Django自定义中间件处理的详细讲解,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解django自定义中间件处理 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • yum源安装mongodb图文教程

    下面是yum源安装mongoDB的详细攻略,包括准备工作、安装步骤和示例说明。 准备工作 确认yum源已经正确配置,可使用命令yum search mongo-10gen-server来检查是否已经可以找到mongo-10gen-server包。 确认系统版本和架构,mongoDB仅支持64位的系统。 安装步骤 安装MongoDB的官方yum源。 使用以下命…

    人工智能概览 2023年5月25日
    00
  • Pytorch 实现自定义参数层的例子

    下面我为您讲解一下 Pytorch 实现自定义参数层的完整攻略。 什么是自定义参数层? 在 Pytorch 中,我们可以自己定义一些层,例如全连接层、卷积层等。但是有些时候我们需要自定义层,这时候我们就需要自定义参数层,它可以包含自己定义的参数,并根据这些参数进行计算。 自定义参数层的实现步骤 下面是实现自定义参数层的步骤: 1. 继承torch.nn.Mo…

    人工智能概论 2023年5月25日
    00
  • VC++中图像处理类CBitmap的用法

    VC++中图像处理类CBitmap的用法 简介 CBitmap是MFC框架下的一个图像处理类,可以方便地进行图像的读取、处理和展示。它封装了基本的位图信息和位图文件的操作方法,可以很好地处理bmp、jpg、png等格式的图像。 CBitmap类的常用方法 1. 构造函数 CBitmap提供了多个构造函数,其中最常用的是默认构造函数CBitmap()和参数为位…

    人工智能概论 2023年5月25日
    00
  • 通用MapReduce程序复制HBase表数据

    通用 MapReduce 程序复制 HBase 表数据是一种将 HBase 表的数据复制到其他数据源的方式,该方式可以使用 MapReduce 技术流对 HBase 中的数据进行批量处理,然后将结果复制到其他数据源中。下面是通用 MapReduce 程序复制 HBase 表数据的详细攻略: 1. 安装 HBase 和 MapReduce 首先需要安装 HBa…

    人工智能概论 2023年5月25日
    00
  • spring boot微服务场景下apollo加载过程解析

    让我来详细讲解“spring boot微服务场景下apollo加载过程解析”的完整攻略。 1. 前言 首先我们需要了解什么是Apollo,它是一个分布式配置中心,能够让我们集中管理应用程序的配置数据。在微服务场景下,我们可以使用Apollo来为各个微服务提供统一的配置管理。 然后,我们需要了解在Spring Boot微服务场景下如何使用Apollo。在本文中…

    人工智能概览 2023年5月25日
    00
  • pyhton中__pycache__文件夹的产生与作用详解

    Python中__pycache__文件夹的产生与作用详解 1. __pycache__目录的作用 Python3.2引入了一项新功能叫做字节码(Byte code)优化,为了加快程序的启动时间和运行速度,Python的编译器在导入模块时会将源代码编译成字节码(.pyc)并将其保存到__pycache__目录下。下次导入该模块时,解释器会优先寻找__pyca…

    人工智能概览 2023年5月25日
    00
  • pytorch构建网络模型的4种方法

    当使用 PyTorch 进行深度学习时,构建网络模型是非常重要的一个环节。下面我们来探讨一下 Pytorch 构建网络模型的四种方法。 方法一:直接继承 nn.Module 类 这是最常用的构建模型的方法。可以创建一个类,继承自 nn.Module 类,并实现他的 forward() 方法。 我们来看一个简单的例子,构建一个具有两个全连接层(linear l…

    人工智能概论 2023年5月25日
    00
  • Python产生batch数据的操作

    Python是一种非常流行的编程语言,非常适合处理大量的数据,并且它的语法十分简洁。在机器学习和深度学习业务中,我们经常需要对数据进行批处理,也就是将大量的数据划分成小块来同时对它们进行处理,以便更高效的训练模型。 下面是Python中如何产生批量数据的操作过程: 准备样本数据 在建立批量数据之前,需要一个数据样本,这样才能更好地说明产生批处理数据的过程。以…

    人工智能概论 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部