Django框架中间件(Middleware)用法实例分析

下面是详细讲解“Django框架中间件(Middleware)用法实例分析”的完整攻略。

一、中间件概述

Django框架中间件(Middleware),指的是处于请求和响应处理之间的一层拦截层。中间件是在Django处理请求的过程中运行的,而非在应用程序中直接运行。

在Django中,中间件可以用于拦截请求或响应,处理请求或响应,以及更改请求或响应。它增加了框架的灵活性,使得我们能够对请求和响应进行更加细致的控制和定制。

二、中间件使用

中间件在settings.py文件中进行配置,将中间件类的路径添加到MIDDLEWARE列表中。

例如,要在Django应用程序中添加中间件“my_middleware.middleware.MyMiddleware”,可以在settings.py文件中添加以下代码:

MIDDLEWARE = [
    # ...
    'my_middleware.middleware.MyMiddleware',
    # ...
]

三、中间件实例说明

下面介绍两个中间件实例:

1. 统计请求时间中间件

这个中间件用于统计请求的处理时间,计算每个请求的处理时间,并将处理结果输出到控制台。

具体代码实现如下:

import time

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

    def __call__(self, request):
        start_time = time.time()  # 程序开始时间
        response = self.get_response(request)
        end_time = time.time()  # 程序结束时间

        print("Request to {} took {:.2f} seconds.".format(request.path, end_time - start_time))

        return response

可以看到,这个中间件实现了一个__call__方法,该方法接收request对象,计算请求处理的时间,并打印到控制台上。

2. JWT中间件

这个中间件用于验证用户的JWT Token,在视图函数被调用之前需要进行验证,如果Token不合法,需要返回一个401 Unauthorized响应。

JWT Token是一个基于JSON的开放标准,用于将声明性数据存储在JSON格式中。JWT的一个优点是它可以用于身份验证,因为它可以包含用户的身份信息。

具体代码实现如下:

import jwt
from django.conf import settings
from django.http import JsonResponse

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

    def __call__(self, request):
        if not request.META.get('HTTP_AUTHORIZATION'):
            # 请求头Authorization不存在
            return JsonResponse({'error': 'Authorization header not found.'}, status=401)

        # 获取Token
        token = request.META.get('HTTP_AUTHORIZATION').split(' ')[1]

        try:
            # 解码Token
            payload = jwt.decode(token, settings.JWT_SECRET_KEY, algorithms=[settings.JWT_ALGORITHM])
            # 将Token中的用户信息如user_id保存到request中
            request.user_id = payload['user_id']
        except:
            # Token解码失败,返回401 Unauthorized响应
            return JsonResponse({'error': 'Invalid Token.'}, status=401)

        response = self.get_response(request)
        return response

这个中间件实现了一个__call__方法,该方法接收request对象,检查请求头中是否存在Authorization,并从中获取Token。对Token进行解码,获取用户信息,并将用户ID信息存储在request对象中。

如果Token解码失败,则返回401 Unauthorized响应,如果Token解码成功,则调用后续的视图函数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django框架中间件(Middleware)用法实例分析 - Python技术站

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

相关文章

  • Python django搭建layui提交表单,表格,图标的实例

    下面是关于“Python django搭建layui提交表单、表格、图标的实例”的完整攻略,包含两条示例说明。 一、搭建环境准备 安装Python及相关扩展:安装Python3.x及pip,安装Django框架、PyMySQL数据库连接器、Django-MySQL数据库引擎、xlwt模块。 安装layui:从官网下载Layui压缩包,将解压后的layui文件…

    Django 2023年5月16日
    00
  • 详解Python的Django框架中Manager方法的使用

    当开发基于Django框架的Web应用程序时,我们需要在模型中使用许多方法来管理数据。其中一个非常重要的方法是Manager方法。在本攻略中,我们将详细讲解Python的Django框架中Manager方法的使用,以及如何在您的应用程序中使用它来管理数据。 什么是Manager方法? Manager方法是一个用于管理Django模型中数据的对象。它允许您定义…

    Django 2023年5月16日
    00
  • Django中apps.py自动在路由加载之前自动寻找其他app中的py文件并加载

    现在settings.py中,如下插入的最后3行 INSTALLED_APPS = [ ‘django.contrib.admin’, ‘django.contrib.auth’, ‘django.contrib.contenttypes’, ‘django.contrib.sessions’, ‘django.contrib.messages’, ‘dja…

    Django 2023年4月13日
    00
  • Django一些常用参数的设置

    在form表单里面   autocomplete=”off”  浏览器输入框关闭自动提示 在ajax里面要发送文件数据需要实例化一个FormData()对象, 还需要设置 processData:false,     //告诉jQuery不要处理我的数据 contentType:false,      //告诉jQuery不要设置content类型 实现示例…

    Django 2023年4月12日
    00
  • DJango之model_to_dict

    导包:from django.forms import model_to_dict 作用:将queryset类型数据转换成字典 def get(self, request, *args, **kwargs): pk = kwargs.get(‘pk’) print(request.GET.dict()) if pk: que = model_to_dict(…

    Django 2023年4月11日
    00
  • Django logging日志模块实例详解(日志记录模板配置)

    让我来给您讲解一下“Django logging日志模块实例详解(日志记录模板配置)”的攻略,涉及到日志记录模板配置的两个示例。 简介 在Django应用程序中使用logging模块记录日志非常重要。因为日志可以帮助我们找到错误并快速解决问题。Django中的logging模块遵循Python的标准库logging模块。logging模块可以让我们记录不同类…

    Django 2023年5月16日
    00
  • 在Django中操作MySQL数据库1:原生 sql 语句操作

    在 Django 中操作数据库有两种方式。第一种方式就是使用原生sql语句操作,第二种就是使用 ORM模型来操作。这里介绍第一种。 Python 操作 MySQL 数据库 Python 标准数据库接口为Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。 DB-API 是一个规范. 它定义了一系列必须的对象和数据库存取方…

    Django 2023年4月9日
    00
  • 【服务后端】MySQL数据库与Django Models不一致问题解决

    1 背景 1.8 Django的APP目录下有makemigrations文件夹,这个文件夹中的文件误删除过,后面从其他电脑的工程目录中拷贝了过来。 进行了python manage.py makemigrations和python manage.py migrate操作。 由于前后的makemigrations的文件不一致,导致数据库中的字段与Django…

    Django 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部