Django 中间件

news2024/10/2 6:43:36

文章目录

    • Django中间件
      • 默认中间件源码分析
      • 自定义中间件
        • process_request(掌握)
        • process_response(掌握)
        • process_view(了解)
        • process_template_response(了解)
        • process_execption(了解)

Django中间件

只要是涉及到全局相关的功能都可以使用中间件方便的完成

  • 全局用户身份校验
  • 全局用户权限校验
  • 全局访问频率校验
"""
django中间件是django的门户
	1.请求来的时候需要经过中间件才能达到真正的django后端
	2.响应走的时候最后也需要经过中间件才能发送出去
"""

在这里插入图片描述

默认中间件源码分析

class SecurityMiddleware(MiddlewareMixin):
        def process_request(self, request):
            path = request.path.lstrip("/")
            if (
                self.redirect
                and not request.is_secure()
                and not any(pattern.search(path) for pattern in self.redirect_exempt)
            ):
                host = self.redirect_host or request.get_host()
                return HttpResponsePermanentRedirect(
                    "https://%s%s" % (host, request.get_full_path())
                )

    def process_response(self, request, response):
        return response


class AuthenticationMiddleware(MiddlewareMixin):
    def process_request(self, request):
        request.user = SimpleLazyObject(lambda: get_user(request))


class CsrfViewMiddleware(MiddlewareMixin):
     def process_request(self, request):
        try:
            csrf_secret = self._get_secret(request)
        except InvalidTokenFormat:
            _add_new_csrf_cookie(request)
        else:
            if csrf_secret is not None:
                request.META["CSRF_COOKIE"] = csrf_secret

    def process_view(self, request, callback, callback_args, callback_kwargs):
        return self._accept(request)
   
    def process_response(self, request, response):
        return response
"""

django支持程序员自定义中间件,并且暴露给程序员五个可以自定义的方法
	1.必须了解
	process_request
	
	process_response
	2.了解即可
	process_view
	
	process_template_response
	
	process_exception
"""    

自定义中间件

"""
1.在项目名或者应用下创建一个任意名称的文件夹,
2.在该文件夹下创建任意任意名字的py文件
3.在该py文件需要书写类,必须继承MiddlewareMixin
	然后就可以自定义五个方法
	(这五个方法用几个写几个,并不需要全都写)
4.需要将类的路径以字符串的形式注册到配置文件中才能生效
"""

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',
    '自己写的中间件路径',
    '自己写的中间件路径',
    '自己写的中间价路径',
]

process_request(掌握)

在这里插入图片描述

启动项目,查看中间件是否生效

在这里插入图片描述


添加一个路由,写一个视图函数,查看执行顺序

from django.contrib import admin
from django.urls import path
from App import  views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/',views.index),
]
# Create your views here.
def index(request):
    print('我是视图函数index')
    return HttpResponse('index')

启动项目,浏览器输入路由

在这里插入图片描述


再写一个中间件,并颠倒注册顺序

在这里插入图片描述


添加返回值

在这里插入图片描述


总结:

  1. 请求来的时候是要经过每一个中间件里的process_request方法,结果的顺序按照配置文件中注册的中间件从上往下的顺序依次执行

  2. 如果中间件里面没有定义process_request方法,直接跳过,执行下一个

  3. 如果该方法返回了HttpResponse对象,那么请求将不再继续往后执行,而是直接原路返回(校验失败,不允许访问)

    1. 所以process_request方法就是用来做全局相关的所有限制功能

process_response(掌握)

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse


class MyMiddleWare(MiddlewareMixin):
    def process_request(self, request):
        print('我是第一个自定义中间件里面的process_request方法')

    def process_response(self, request, response):
        print('我是第一个自定义中间件里面的process_response方法')

        """

        :param request:
        :param response: django后端返回给浏览器的内容
        :return:
        """
        return response


class MyMiddleWare2(MiddlewareMixin):
    def process_request(self, request):
        print('我是第二个自定义中间件里面的process_request方法')

    def process_response(self, request, response):
        print('我是第二个自定义中间件里面的process_response方法')
        return response

浏览器输入路由,回车

在这里插入图片描述

返回自己的HttpResponse对象

原本后端是要返回index的,走到中间件里面,先经过MyMiddleWare,返回index,但是经过MyMiddleWare2的时候来了一个偷天换日,把原本想要返回的响应换成自己的hello!,之后所有的中间件拿到的全是自己写的返回响应的内容

在这里插入图片描述

总结:

  1. 响应走的时候需要经过每一个中间件里的process_response方法,该方法有两个额外的参数(request,response)

  2. 该方法必须返回一个HttpResponse对象

    1. 默认返回的就是形参response,
    2. 也可以自己返回自己的HttpResponse对象
  3. 顺序是按照配置文件中注册了的中间件从下往上依次经过,如果没有定义,直接执行上一个


如果在先注册了的中间件中的process_request方法就已经返回了HttpResponse对象,那么响应走的时候经过所有的中间件里面的process_response是否有其他情况?

在这里插入图片描述

观察上图得出以下结论

​ 首先请求来的时候,会依次经过每一个注册了的中间件里的process_request方法,一旦process_request方法返回了一个HttpResponse对象,那么会直接不再往下走,而是直接经过同级别的process_response往外走。

在这里插入图片描述


在这里插入图片描述

process_view(了解)

def process_view(self, request, view_name, *args, **kwargs):
    print(view_name, args, kwargs)
    print('我是第一个自定义中间件里的process_view')

特点:

路由匹配成功之后,执行视图函数之前,会自动执行中间件里面的process_view方法,顺序按照配置文件中注册的中间件从上往下的顺序依次执行

在这里插入图片描述

process_template_response(了解)

def process_response(self, request, response):
    print('我是第二个自定义中间件里面的process_response方法')
    return response
# views.py

def index(request):
    print('我是视图函数index')
    obj = HttpResponse('index')

    def render():
        print('内部的render')
        return HttpResponse('98K')

    obj.render = render
    return obj

返回的HttpResponse对象有render属性的时候,才会触发,顺序是

按照配置文件中注册的中间件从下往上依次经过

在这里插入图片描述

process_execption(了解)

def process_exception(self, request, exception):
    print(exception)
    print('我是第二个自定义中间件里的process_exception')

当视图函数中出现异常的情况下,触发。

顺序是按照配置文件中注册的中间件从下往上依次经过

在这里插入图片描述

全部代码:

# -*- coding: UTF-8 -*- 
# @Date :2022/11/9 19:03
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse


class MyMiddleWare(MiddlewareMixin):
    def process_request(self, request):
        print('我是第一个自定义中间件里面的process_request方法')

    def process_response(self, request, response):
        print('我是第一个自定义中间件里面的process_response方法')

        """

        :param request:
        :param response: django后端返回给浏览器的内容
        :return:
        """
        return response

    def process_view(self, request, view_name, *args, **kwargs):
        print(view_name, args, kwargs)
        print('我是第一个自定义中间件里的process_view')

    def process_template_response(self, resquest, response):
        print('我是第一个自定义中间件里的process_template_response')
        return response

    def process_exception(self, request, exception):
        print(exception)
        print('我是第一个自定义中间件里的process_exception')


class MyMiddleWare2(MiddlewareMixin):
    def process_request(self, request):
        print('我是第二个自定义中间件里面的process_request方法')
        # return HttpResponse('JayChou')

    def process_response(self, request, response):
        print('我是第二个自定义中间件里面的process_response方法')
        return response
        # return HttpResponse('hello !')

    def process_view(self, request, view_name, *args, **kwargs):
        print(view_name, args, kwargs)
        print('我是第二个自定义中间件里的process_view')

    def process_template_response(self, resquest, response):
        print('我是第二个自定义中间件里的process_template_response')
        return response

    def process_exception(self, request, exception):
        print(exception)
        print('我是第二个自定义中间件里的process_exception')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/7580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python基于PHP+MySQL的在线汽车租赁管理系统

随着时代的发展,汽车已经成为当代人们代步的主要工具。但是很多时候人们并没有购车的念头,这个时候就出现了一种新的行业,就是汽车租赁行业,这样不仅可以解决用车的需求,而且可以节省大量的购车成本,为了能够方便用户进行汽车租赁我们开发了PHP在线汽车租赁管理系统,本系统分为…

软件版本号详解

我们现在的生活离不开软件,版本号一般不会引起大家的关注,但是一旦软件出现了Bug或者其他问题,这个时候,软件的提供方都会让用户提供其软件的版本号。软件版本号长什么样呢?上面这张截图是我们常用的手机APP&#xff0…

关于git你应该知道的一些东西

前言 好好写代码,好好的反思踩过的坑,然后尽量不要给别人挖坑。这是我对自己,以及每个刚入行或即将的小伙伴的建议。一个软件工程项目,是一个系统性极强且较为复杂的工作,会有很多人参与到这个工作中来,如何…

Yarn pengding任务的原因之一:Reserved

一、背景 系统:linux centos7.4 Yarn:3.0.0-cdh6.3.2 二、现象 业务方通知,大部分使用yarn的任务都长时间处于执行中的状态。 三、问题排查 查看yarn的ui发现,memory reserved的值,已经和memory total等值了。 然…

Unity内实现无卡顿取图像推流/截屏等功能

文章目录 一、Unity提供的ScreenCapture取图像接口二、我们一个一个看API:三、Unity日本大神keijiro还提供了一种异步截图的方案,完整代码如下:一、Unity提供的ScreenCapture取图像接口 众所周知,Unity提供了ScreenCapture API用来获取引擎最终渲染到屏幕的图像: 二、我…

深度学习入门(三十五)计算性能 编译器和解释器

深度学习入门(三十五)计算性能 编译器和解释器前言计算性能——编译器和解释器教材1 符号式编程2 混合式编程3 Sequential的混合式编程3.1 通过混合式编程加速3.2 序列化4 小结前言 核心内容来自博客链接1博客连接2希望大家多多支持作者 本文记录用&…

【离散数学】第一章 测试

1. A. 对 B. 错 正确答案:A 2. A. 对 B. 错 正确答案:B 3. A. 错 B. 对 正确答案:B 4.p↔q⇔p↔q A. 对 B. 错 正确答案:A 5. A. 对 B. 错 正确答案:A 6.n个命题变元组成的命题公式共有( )种不同的…

小胶质细胞仅仅是神经系统内的“配角”?

大脑中存在着数量众多的神经胶质细胞,约占人类大脑细胞的 90%;不同类型的胶质细胞在起源、组成、形态和解剖学上都是不同的,而且它们发挥着不同的功能。 图 1. 中枢神经系统的四种神经细胞 小胶质细胞与 AD 疾病进程 小胶质细胞是一类来源于…

数据分析的重要性体现在哪?

近几年,数据分析成为了当今IT界的新起之秀,在我国互联网飞速发展的浪潮下,无论是公司职员还是个体商户或大公司管理者,都需要学习掌握数据分析的能力,它已经成为数据时代各行各业突破各自行业发展瓶颈的最有效手段。 那…

微信小程序复习题

文章目录填空题选择题判断题分析题(20)分析代码显示效果页面设计题(40)填空题 微信小程序创始人是 张小龙 ,英文缩写 Mini Program小程序是一种无需下载和无需安装即可使用的应用,它实现了应用“ 触手可得…

[附源码]java毕业设计基于web的硕士研究生入学考务管理

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

5、Redis的发布和订阅

文章目录5、Redis的发布和订阅5.1、什么是发布和订阅5.2、Redis的发布和订阅5.2.1、客户端可以订阅频道如下图5.2.2、当给这个频道发布消息后,消息就会发送给订阅的客户端5.3、发布订阅命令行实现5.3.1、打开一个客户端订阅channel15.3.2、打开另一个客户端&#xf…

Day32——二叉树专题

文章目录28.删除二叉搜索树的节点29.修剪二叉搜索树30.将有序数组转换为二叉搜索树31. 把二叉搜索树转换为累加树28.删除二叉搜索树的节点 题目链接:450. 删除二叉搜索树中的节点 - 力扣(LeetCode) 如果目标节点大于当前节点值,则…

MapReduce编程模型——自定义序列化类实现多指标统计

🏠Hadoop序列化 👉序列化 序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输。反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据,转换成内存中的对象。 &#…

7天酒店亮相中国国际饭店业大会元宇宙线上展 创见酒店投资新未来

11月12日,由中国饭店协会主办的第一届酒旅菁英品牌嘉年华“元宇宙”线上展成功举行。7天酒店“元宇宙”展馆首度亮相,通过数字化交互、虚拟展厅、线上路演等,为行业和市场带来耳目一新的创新营销形式。 作为第七届中国国际饭店业大会的线上分…

基于微信小程序的药店管理系统设计与实现-计算机毕业设计源码+LW文档

小程序开发说明 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Mav…

蓝牙HID——将android设备变成蓝牙鼠标/触控板(BluetoothHidDevice)

前言 本篇为蓝牙HID系列篇章之一,本篇以红米K30(MIUI13即Android 12)手机作为蓝牙HID设备,可以与电脑、手机、平板等其他蓝牙主机进行配对从而实现鼠标触控板的功能。 蓝牙HID系列篇章: 蓝牙HID——将android设备变成…

babel-plugin-import 实现按需引入

官方文档:https://github.com/umijs/babel-plugin-import#usage 为什么需要这个插件? 在 antd 和 element 两个组件库中,index.js 分别是这样的: // antd export { default as Button } from ./button; export { default as Tab…

智能云门禁解决方案来了

传统门禁存在的问题 01、安全性差:传统门禁卡易被复制和盗用无法精准识别进出人员身份造成较大安全隐患。 02、通行不便:要求人员近距离操作,当使 用者双手被占用时通行不便 门禁卡丢失或密码遗忘造成 无法开门。 03、管理困难&#xff1a…

Multilevel Cooperative Coevolution for Large Scale Optimization

0、论文背景 本文在CCEA_G的基础上,提出了MLCC框架。在MLCC中,基于不同组大小的随机分组策略构造了一组问题分解器。演化过程分为若干个循环,在每个周期开始时,MLCC使用自适应机制根据其历史性能选择分解器。由于不同的组大小捕获…