深入理解Django的中间件middleware

yizhihongxing

深入理解 Django 的中间件 Middleware

Django 的中间件是一种可插拔的方式,可以处理用户请求和响应的过程,常用于处理日志、安全、缓存、权限等。本文介绍如何使用 Django 的中间件,并提供两个示例说明。

1. 中间件的基本结构

Django 中间件的基本结构包括了三个方法:

  • __init__(self, get_response):在中间件被初始化时执行,可用于对中间件进行设定。
  • __call__(self, request):每次接受请求时都会执行,可用于处理请求前的逻辑。
  • process_response(self, request, response):在视图响应后执行,可用于处理响应后的逻辑。

这三个方法中,只有 __call__ 是必须实现的方法,其他两个方法是可选的。

下面看一个简单的中间件示例。

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

    def __call__(self, request):
        request.url, request.path = request.path, request.url
        response = self.get_response(request)
        return response

上面代码中,定义了一个简单的中间件类 SwapMiddleware。该中间件只有 __init____call__ 两个方法。在 __init__ 方法中,我们通过接收 get_response 参数来保存访问视图函数时的回调函数。而在 __call__ 方法中,我们将 request 的 url 和 path 交换位置,并调用回调函数 self.get_response(request) 拿到响应。(该例子是将 request 中的 url 和 path 交换位置,纯属娱乐,开发中并不会使用)

2. 中间件的配置

Django 的中间件需要在 django.settings.py 文件中进行配置。中间件按照顺序依次执行,如果前面的中间件处理了请求,那么后面的中间件将不再执行处理逻辑。这点需结合中间件的定义来理解。一般而言,中间件配置有两个关键字:

  • MIDDLEWARE:是一个中间件列表,最好指定顺序。
  • MIDDLEWARE_CLASSES:是一个中间件类路径列表,大多数 legacy 代码使用这个指令。

下面是一个完整的配置示例:

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',
]

上面代码中,定义了 Django 官方推荐的中间件顺序。

3. 示例一:处理请求头

假设我们的网站需要验证每个请求中是否有指定的请求头 Authorization,并获取请求头的值作为当前用户的 token,那么我们可以编写一个自定义中间件来完成该功能。代码如下:

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

    def __call__(self, request):
        authorization = request.META.get('HTTP_AUTHORIZATION')
        request.token = authorization.split()[1] if authorization else None
        response = self.get_response(request)
        return response

上面这个自定义中间件的作用是通过 request.META 获取请求头 Authorization,并从中获取值作为 token 存储在 request 对象中,便于后续的视图函数使用。

4. 示例二:限制访问频率

假设我们的网站需要限制用户访问频率,每秒钟只允许访问一次。那么我们可以编写一个自定义中间件来处理该功能。代码如下:

import time

class RateLimitMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        self.limits = {}  # 记录各 IP 的上次访问时间

    def __call__(self, request):
        ip = self.get_client_ip(request)
        now = time.time()
        last_visit_time = self.limits.get(ip, 0)
        if now - last_visit_time < 1:
            return HttpResponseForbidden('您访问过于频繁,请稍后再试。')
        self.limits[ip] = now
        response = self.get_response(request)
        return response

    def get_client_ip(self, request):
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = request.META.get('REMOTE_ADDR')
        return ip

上面代码中,自定义中间件 RateLimitMiddleware 记录了各个用户的最近一次访问时间,如果与当前时间的时间差小于 1 秒,则返回一个 403 Forbidden 的响应即可。

值得注意的是,这个方法获取 IP 的方式,因网络架构的不同,可能无法获取到用户真实 IP。但是我们可以通过 Nginx 的 proxy_set_header 指令来弥补,具体可参考资料。

5. 总结

本文简单介绍了 Django 中间件的基本结构和配置方法,并提供了两个常用的示例说明,分别用于处理请求头和限制访问频率。中间件是 Django 一种强大的可插拔机制,可以用于丰富项目功能,并提高代码的可读性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解Django的中间件middleware - Python技术站

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

相关文章

  • Django实现在线无水印抖音视频下载(附源码及地址)

    下面是详细的攻略。 标题 简介 在这个攻略中,我们将使用Django框架实现一个在线无水印抖音视频下载的功能。用户可以通过输入抖音视频链接,获取无水印视频下载地址,并下载视频。 实现步骤 安装Django 首先,需要安装Django框架。可以通过以下命令进行安装: pip install Django 安装完成后,可以通过以下命令检查是否安装成功: djan…

    人工智能概论 2023年5月25日
    00
  • 如何在sae中设置django,让sae的工作环境跟本地python环境一致

    以下是在sae中设置Django的完整攻略: 1. 创建Sae应用 首先,在sae上创建一个Python应用,选择Python 2.7版本,并绑定自己的域名。绑定域名后,获取到自己的 SAE AccessKey 和 SecretKey。 2. 配置本地开发环境 在本地创建一个虚拟环境,安装Django和其它需要的包 $ mkdir ~/myproject $…

    人工智能概览 2023年5月25日
    00
  • 电脑安装windows与Centos双系统时引发问题小结

    电脑安装windows与Centos双系统时引发问题小结 在电脑中安装多个操作系统是很常见的操作,通过双系统的方式来满足不同的需求。但是,在安装过程中可能会遇到一些问题,接下来我们来介绍安装过程中可能出现的问题以及解决方案。 安装过程中可能出现的问题 1.分区问题 在安装双系统时,需要分出一定的磁盘空间来安装另一个系统。如果没有足够的空间或者分区方式不正确,…

    人工智能概览 2023年5月25日
    00
  • go如何优雅关闭Graceful Shutdown服务

    为了实现优雅关闭(Graceful Shutdown)服务,我们需要了解两个重要的概念:闲置连接(idle connections)和上下文(context)。 在 Go 语言中,服务器和客户端之间的连接是通过 net.Conn 实现的,服务器在和客户端建立连接之后就可以可以向客户端发送数据,同时也可以从客户端读取数据。在大多数情况下,服务器与客户端之间的交…

    人工智能概览 2023年5月25日
    00
  • 使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)

    使用PyTorch搭建AlexNet操作的完整攻略可以分为两部分:微调预训练模型和手动搭建。下面分别介绍这两个部分的具体操作过程和代码示例: 微调预训练模型 微调预训练模型旨在通过对一个已经在大型数据集上训练过的模型进行细调,来提高该模型在你自己的数据集上的表现。常见的预训练模型包括AlexNet、VGG、ResNet等。下面以AlexNet为例,介绍微调预…

    人工智能概论 2023年5月25日
    00
  • MongoDB安装到windows服务的方法及遇到问题的完美解决方案

    下面是详细的MongoDB安装到Windows服务的方法以及遇到问题的完美解决方案: 1. 环境准备 首先需要在Windows系统中安装MongoDB,具体安装步骤可参考MongoDB官方网站的安装指南。安装完成后需要配置环境变量,将MongoDB的bin目录路径添加至系统Path中。 2. 安装MongoDB服务 在命令提示符中以管理员权限运行,进入Mon…

    人工智能概览 2023年5月25日
    00
  • nginx+uwsgi启动Django项目的详细步骤

    启动 Django 项目通常需要 web 服务器与应用服务器的支持。其中, nginx 是最常用的 web 服务器,而 uwsgi 是更加适合于长时间运行的应用服务器之一,两者的配合可以起到更好的效果。本文主要介绍如何使用 nginx 和 uwsgi 在 Linux 上启动 Django 项目。 安装 nginx 和 uwsgi 在 Ubuntu / Deb…

    人工智能概览 2023年5月25日
    00
  • Java操作Mongodb数据库实现数据的增删查改功能示例

    下面是Java操作Mongodb数据库实现数据的增删查改功能示例的完整攻略: 一、准备工作 1. 安装Mongodb Mongodb是一款开源的面向文档的NoSQL数据库,它支持多种编程语言,同时也有官方的Java驱动,可以使用Maven进行依赖的引入,可以到官网进行下载和安装。 2. 引入依赖 可以在Java工程中使用Maven进行引入Mongodb Ja…

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