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日

相关文章

  • django+uwsgi+nginx部署(非常详细)

    django+uwsgi+nginx部署   1.介绍:   在网上看了很多教程,但自己部署了很久都没有成功,这篇博文记录自己所踩过得坑。   2.环境: 1 Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-130-generic x86_64)   3.下载uwsgi以及nginx 1 apt-get install uwsgi 2…

    Django 2023年4月11日
    00
  • django-生成随机验证码

    Python生成随机验证码,需要使用PIL模块. 安装: pip3 install pillow 1   1 pip3 install pillow 基本使用 1.创建图片 from PIL import Image #导入模块 img=Image.new(mode=”RGB”,size=(120,40),color=”yellow”) f=open(“va…

    2023年4月9日
    00
  • Django框架视图函数设计示例

    接下来我将详细讲解“Django框架视图函数设计示例”的完整攻略,该攻略将包括两条示例说明。 1. 示例一:实现基本的GET请求和POST请求 在Django框架中,视图函数是用来响应URL请求的函数,包含了对请求的处理逻辑。下面是一个简单的视图函数示例,演示了如何实现基本的GET请求和POST请求: from django.shortcuts import…

    Django 2023年5月16日
    00
  • django重置管理员密码

    django版本1.11 >>> from django.contrib.auth.models import User>>> user = User.objects.get(username=’your account’)>>> user.set_password(‘your password’)&gt…

    Django 2023年4月13日
    00
  • Django中的DRF框架视图集使用

    1. 两个基类 1)APIView Django REST_framework 中所有视图的基类是APIView   父类是View 支持定义的属性: authentication_classes 列表或元祖,身份认证类 permissoin_classes 列表或元祖,权限检查类 throttle_classes 列表或元祖,流量控制类 在APIView中…

    Django 2023年4月16日
    00
  • Django框架之django admin的命令行详解

    Django框架之django admin的命令行详解 Django框架内置了一个功能强大的管理后台django admin,可以通过命令行对其进行配置和管理。 配置命令 createsuperuser 该命令用于创建超级管理员用户,语法如下: python manage.py createsuperuser changepassword 该命令用于修改用户…

    Django 2023年5月16日
    00
  • Django框架模板的使用方法示例

    下面是本文档的详细讲解“Django框架模板的使用方法示例”的完整攻略,其中包含两条示例说明: Django框架中模板的基本使用方法 创建Django项目 首先我们需要使用Django创建一个新的项目: django-admin startproject mysite 创建Django应用 接着我们需要在Django项目中创建一个应用程序: python m…

    Django 2023年5月16日
    00
  • Django + Axios & Ajax post和get 传参

    话说千遍淡如水,不如代码来一通。   Axios post: let params = new URLSearchParams(); params.append(‘id’,xx) axios({ url:’http://127.0.0.1:8000/userctrl/shoucang’, method:’post’, data:params, respons…

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