详解django自定义中间件处理

当我们使用 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日

相关文章

  • 制作nginx的RPM包教程

    Sure. 制作 nginx 的 RPM 包,主要分为以下几个步骤: 准备环境 下载和解压源代码 安装必要的依赖包 根据实际需求进行配置 打包成 rpm 安装包 下面,我将分别为您详细讲解每个步骤: 第一步:准备环境 需要在 Linux 系统中执行打包操作,因此需要有一个 Linux 环境。另外,需要安装打包需要用到的工具,如 rpmbuild 工具等。具体…

    人工智能概览 2023年5月25日
    00
  • 在Laravel中使用MongoDB的方法示例

    下面是关于在Laravel中使用MongoDB的方法示例的完整攻略。 简介 MongoDB是一个非关系型数据库,它与传统的关系型数据库不同,它支持复杂的数据结构和更强大的查询语言。Laravel是一个流行的PHP框架,它提供了最基本的ORM和查询构建器来支持多种关系型数据库。但是,如果你需要在Laravel中使用MongoDB,你需要一些额外的库和工具。 步…

    人工智能概论 2023年5月25日
    00
  • pytorch实现onehot编码转为普通label标签

    首先,需要明确的是,在机器学习中,常用的标签表示方法有两种,一种是onehot编码,另一种是普通的标签,也称为分类标签。在训练模型时,我们会将数据的标签转为模型能够识别的形式,而pytorch作为一款强大的深度学习框架,自然不会缺少对标签进行转换的功能。 下面是实现“pytorch实现onehot编码转为普通label标签”的完整攻略: 1.加载数据集并进行…

    人工智能概论 2023年5月25日
    00
  • 详解Nodejs 部署到阿里云全过程

    详解Nodejs部署到阿里云全过程 本文将详细介绍如何将Node.js应用程序部署到阿里云服务器上。 前置条件 在开始之前,您需要满足以下条件: 一台阿里云ECS实例,主机操作系统建议选择 Ubuntu 16.04 64bit。 已安装Node.js和npm。 步骤一:安装PM2 PM2是一个Node.js应用程序的进程管理器,可以在后台运行,自动重启失效的…

    人工智能概论 2023年5月24日
    00
  • 在Windows系统上搭建Nginx+Python+MySQL环境的教程

    下面详细讲解在Windows系统上搭建Nginx+Python+MySQL环境教程: 1. 安装Nginx服务器 Nginx是一个开源的高性能Web服务器,常用于反向代理服务器,支持多种协议,包括HTTP、HTTPS、SMTP、POP3等。 下载Nginx服务器: 到Nginx官网下载适合Windows系统的版本; 将下载好的压缩包解压至你想要安装的目录下;…

    人工智能概览 2023年5月25日
    00
  • Tensorflow之梯度裁剪的实现示例

    下面是“Tensorflow之梯度裁剪的实现示例”的完整攻略。 什么是梯度裁剪? 梯度裁剪是一种常见的优化技巧,用于限制梯度的范围,避免梯度爆炸或消失。在深度学习中,梯度裁剪常用于RNN等网络中,比如LSTM、GRU等。 梯度裁剪的实现方法 Tensorflow提供了两种梯度裁剪的实现方式: 1. tf.clip_by_norm tf.clip_by_nor…

    人工智能概论 2023年5月25日
    00
  • pytorch中部分矩阵乘法和数组乘法的小结

    下面是关于“pytorch中部分矩阵乘法和数组乘法的小结”的攻略: 1. 矩阵乘法 在pytorch中,矩阵乘法是通过torch.matmul()函数实现的。矩阵乘法需要满足两个矩阵尺寸匹配的条件,即左矩阵的列数等于右矩阵的行数。 1.1 两个矩阵相乘 以下是两个矩阵相乘的示例: import torch a = torch.tensor([[1, 2], …

    人工智能概论 2023年5月25日
    00
  • Spring Cloud中Sentinel的两种限流模式介绍

    Spring Cloud中的Sentinel框架是一个轻量级的流量控制框架,它提供了两种主要的限流模式:流量控制和熔断降级。以下是对这两种模式的详细介绍: 流量控制 直接限流模式 Sentinel中的直接限流模式是一种比较简单的限流模式,在该模式下,Sentinel会限制每个资源对应的请求流量不得超过预定的阈值,一旦超过这个阈值,Sentinel就会拒绝请求…

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