Django之五种中间件定义类型—process_request、process_view、process_response.......

目录

[1. 前言](#1. 前言)

[2. 基础中间件](#2. 基础中间件)

[3. 如何自定义中间件](#3. 如何自定义中间件)

[4. 五种自定义中间件类型](#4. 五种自定义中间件类型)

[4.1 process_request](#4.1 process_request)

[4.2 process_view](#4.2 process_view)

[4.3 process_response](#4.3 process_response)

[4.4 process_exception](#4.4 process_exception)

[4.5 process_template_response](#4.5 process_template_response)

[5. 最后](#5. 最后)

1. 前言

哈喽,大家好,我是小K,今天咋们分享的内容是:Django中的五种自定义中间件类型

在Django中,有一种特殊的存在,那就是中间件

中间件是一种轻量化可复用 的Django组件,可以在请求之前、之后、视图之前或者响应之后作出一些动作,例如身份验证或者限流等。

本篇文章带你学会五种自定义中间件类型:

process_request、process_view、process_response、process_exception、process_template_response

2. 基础中间件

在学习自定义中间件时,我们先来看Django中已有的中间件:

  1. django.middleware.security.SecurityMiddleware: 这是Django的安全中间件,用于实施各种安全策略,例如设置HTTP头部以防止一些类型的攻击。

  2. django.contrib.sessions.middleware.SessionMiddleware: 这是用于处理会话的中间件,它允许您在请求之间存储和检索数据。

  3. django.middleware.common.CommonMiddleware: 这个中间件处理一般的HTTP请求和响应,例如添加适当的头部信息、处理URL重定向等。

  4. django.middleware.csrf.CsrfViewMiddleware: 这是用于处理跨站请求伪造保护的中间件,它确保每个POST请求都包含有效的CSRF令牌。

  5. django.contrib.auth.middleware.AuthenticationMiddleware: 这个中间件用于处理用户身份验证,它将用户对象添加到每个请求。

  6. django.contrib.messages.middleware.MessageMiddleware: 这个中间件用于处理Django消息框架中的消息。

  7. django.middleware.clickjacking.XFrameOptionsMiddleware: 这个中间件用于设置X-Frame-Options头,以防止点击劫持攻击。

3. 如何自定义中间件

在了解基础中间件之后,我们来看看如何自定义中间件:

我们可以随便创建一个文件,下面创建一个自定义模块:

'

在这个模块中,我们单独定义类:

先不看具体的代码

python 复制代码
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin


class AuthenticateUser(MiddlewareMixin):
    def process_request(self, request):
        # request是请求相关所有的数据
        if request.GET.get("token") == '123456':  # 判断用户是否携带token,也就是是否登录
            request.role = 'user'  # 当前角色为普通用户
            return
        return HttpResponse('出错了')

    def process_view(self, request, view, *args, **kwargs):
        # request是请求相关所有的数据; view是试图函数; 路由参数*args, **kwargs
        if 'admin' in request.path_info.split('/')[1] and request.role == 'user':  # 如果当前url以admin开头的话,用户是无权限访问的

            return HttpResponse("无权限访问")
        return

    def process_response(self, request, response):
        # request是请求相关所有的数据
        # response是试图函数返回的那个对象(封装了要返回到用户浏览器的所有数据)
        response['name'] = 'jiaoxingk'  # 在返回的时候,加入一些返回值信息
        return response

    def process_exception(self, request, exception):
        print(request)
        print(exception, type(exception))
        return HttpResponse("错误了")

    def process_template_response(self, request, response):
        response.body = 'hello'
        return response

接着,我们需要注册中间件,也就是通过字符串路径的形式,进行动态导入

不知道为什么通过字符串可以动态导入的原理的话,可以参考我的这篇文章:

Python中的反射------getattr与动态导入模块

4. 五种自定义中间件类型

ok, 现在我们来具体看看以上自定义中间件的具体代码:

4.1 process_request

这是在请求到来之后,所执行的操作。

请求一来,最先做的应该是匹配相应的视图函数,而加上process_request,就代表在匹配之前,就截停了请求,开始执行操作

校验token,看是否登录(假装123456代表用户登录了)

如果登录了,就给该用户的角色定义为普通用户,然后返回空值,代表继续执行匹配

如果没有就提前截停请求,直接返回响应

4.2 process_view

此时,请求已经匹配到相应的视图函数,但是在执行视图函数之后,又做了一次操作:

这里,判断url的前缀是不是admin(管理员才能访问的),如果你只是普通用户的话,那么会没有权限继续访问了。

因此,这里就提前截停,返回值

4.3 process_response

现在,视图函数也已经执行完了,该返回给浏览器了

在返回之前,我加了一条响应信息,代表我当前的一个记录

这是浏览器里面可以看到的:

4.4 process_exception

如果在执行视图的时候,出现了异常,那么就会执行这里的语句:

4.5 process_template_response

这个比较特殊,主要对于视图函数返回内容渲染扩展。

process_template_response的调用前提是:

  1. 在视图函数中如果返回的对象内部有一个render方法且可以被调用执行

  2. process_template_response返回response参数(返回值)

  3. 在自定义的MyReponse的render方法中必须返回HttpRespose

基本不常用这个。

5. 最后

好了,今日的中间件分享就到这里吧。

对于后两个中间件类型,一般是不常用的,主要还是process_request、process_view、process_response这三种用的比较多

了解到中间件的基础用法之后,咋们下一节开始深入研究它的底层源码啦,看看中间件到底是如何加载并且运行的。

相关推荐
哆啦A梦的口袋呀6 分钟前
基于Python学习《Head First设计模式》第六章 命令模式
python·学习·设计模式
努力搬砖的咸鱼9 分钟前
从零开始搭建 Pytest 测试框架(Python 3.8 + PyCharm 版)
python·pycharm·pytest
Calvex11 分钟前
PyCharm集成Conda环境
python·pycharm·conda
一千柯橘23 分钟前
python 项目搭建(类比 node 来学习)
python
sduwcgg28 分钟前
python的numpy的MKL加速
开发语言·python·numpy
大模型真好玩29 分钟前
可视化神器WandB,大模型训练的必备工具!
人工智能·python·mcp
东方佑31 分钟前
使用 Python 自动化 Word 文档样式复制与内容生成
python·自动化·word
钢铁男儿36 分钟前
Python 接口:从协议到抽象基 类(定义并使用一个抽象基类)
开发语言·python
databook1 小时前
当机器学习遇见压缩感知:用少量数据重建完整世界
python·机器学习·scikit-learn
M1A11 小时前
Python数据结构操作:全面解析与实践
后端·python