首页 > 其他分享 >22、Django-中间件-Middleware

22、Django-中间件-Middleware

时间:2024-07-09 22:42:52浏览次数:7  
标签:22 process 中间件 Middleware request response self view

1、中间件是Django请求/响应处理的钩子框架、他是一个轻量级的、低级的“插件”系统,用于全局改变Django的输入或输出

2、中间件以类的形式体现

3、每个中间件组件负责做一些特定的功能、例如:Django包含一个中间件组件AuthentucationMiddleware、它使用会话将用户与请求关联起来

4、类似高速收费站、将一些流量或请求拦截符合要求的才能通过-这就是钩子函数

 

编写中间件

1、中间件类必须继承自django.utils.deprecation.MiddlewareMixin类

2、中间件类必须实现下列五个方法中的一个或多个:
  -- process_request(self, request)
    -- 执行路由之前被调用、在每个请求上调用、返回None或HttpResponse对象
    
  -- process_view(self,request, callback, callback_args,callback_kwargs)
    -- 调用视图函数之前被调用、在每个请求上调用、返回None或HttpResponse对象
    
  -- process_response(self, request, response)
    -- 所有响应返回浏览器被调用,在每个请求上调用,返回HttpResponse对象
    
  -- process_exception(self, request, exception)
    -- 当处理过程中抛出异常时调用、返回一个HttpResponse对象
    
    
  -- process_template_response(self, request, response)
    -- 在视图函数执行完毕且试图返回的对象中包含render的方法时被调用、该方法需要返回实现了render方法的响应对象
    
#注意:中间件中的大多数方法在返回None时标识忽略当前操作进入下一项事件、当返回HttpResponese对象时标识此请求结束、直接返回给客户端

 

使用中间件

在setting.py中需要注册一下自定义的中间件
#file:settings.py
MIDDLEWARE = [
    ......中间件....

]


#一般需要在项目的目录下(与app应用同级)创建一个middleware目录用于写中间件的代码

 

创建中间件:

1、创建中间件的py文件
mymiddleware.py
--------------------------------------------------------------------------------------------
from django.utils.deprecation import MiddlewareMixin

from django.utils.deprecation import MiddlewareMixin


class MyMW(MiddlewareMixin):    # MiddlewareMixin是Django提供的一个中间件的基类,它实现了__call__方法,

    # process_request:在路由之前执行
    def process_request(self, request):
        print('MyMW process_request do--- 进到路由之前。。。')

    # process_view:在路由之后执行、也就是匹配路由之后执行
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print('MyMW process_view do--- 进到路由之后、视图函数之前。。。')

    def process_response(self, request, response):
        print('MyMW process_response do--- 响应返回之前。。。')
        return response     # 必须返回response对象


class MyMW2(MiddlewareMixin):    # MiddlewareMixin是Django提供的一个中间件的基类,它实现了__call__方法,

    # process_request:在路由之前执行
    def process_request(self, request):
        print('MyMW2 process_request do--- 进到路由之前。。。')

    # process_view:在路由之后执行、也就是匹配路由之后执行
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print('MyMW2 process_view do--- 进到路由之后、视图函数之前。。。')

    def process_response(self, request, response):
        print('MyMW2 process_response do--- 响应返回之前2。。。')
        return response     # 必须返回response对象
    
----------------------------------------------------------------------------------------------

2、到setting.py中的 MIDDLEWARE =[] 中去注册
------------------------------------------------------------------------------------------
MIDDLEWARE = [
    。。。。。。。。。。
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'middleware.mymiddleware.MyMW',    #注册中间件的类
    'middleware.mymiddleware.MyMW2'
]
--------------------------------------------------------------------------------------

3、在视图函数中
views.py
---------------------------------------------------------------------
from django.http import HttpResponse
from django.shortcuts import render

def test_view(request):
    print('test_view in 测试')

    return HttpResponse('test_view in 测试')
-----------------------------------------------------------------------------------

4、添加路由
urls.py
------------------------------------------------------------
from django.contrib import admin
from django.urls import path
from midware import views

urlpatterns = [
    path('admin/', admin.site.urls),
    
    path('test_view/' , views.test_view)
]
------------------------------------------------------------------


#访问:http://127.0.0.1:8000/test_view/

#注意:配置为数组、中间件被调用时、以‘先上到下’再‘由下到上’ 的顺序调用

 

 

练习:

在mymiddleware.py中添加
----------------------------------------------------------------
import re

class VisitLimit(MiddlewareMixin):

    visit_times = {}

    def process_request(self, request):
        ip_address = request.META['REMOTE_ADDR']    # 获取客户端的ip地址
        path_url = request.path_info    # 获取客户端请求的url地址

        # 判断是否是访问test开头的url
        if not re.match('^/test', path_url):
            return

        # 获取key的值、判断是否是第一次访问
        times = self.visit_times.get(ip_address, 0) #使用get当字典中不存在时这个值时、默认为0
        print('ip', ip_address, '已经访问', times)
        # 访问次数+1
        self.visit_times[ip_address] = times + 1

        if times < 5:   # 判断访问次数、访问次数小于5次、允许访问
            return

        # 访问次数大于5次、不允许访问
        return HttpResponse('访问次数过多' + str(times) + '次, 访问禁止')
    
-------------------------------------------------------------------------------------------

在setting.py中添加中间件
------------------------------------------------------------
MIDDLEWARE = [
    。。。。。。。。
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'middleware.mymiddleware.MyMW',
    'middleware.mymiddleware.MyMW2',
    'middleware.mymiddleware.VisitLimit',

]
-----------------------------------------------------------------

#访问:http://127.0.0.1:8000/test_view/  

 

 

标签:22,process,中间件,Middleware,request,response,self,view
From: https://www.cnblogs.com/littlecc/p/18190283

相关文章

  • 生产实习--启明星辰 第四天(Web网络安全基础知识,sql注入,xss攻击,csrf与ssrf,xxe攻击,未授
    web安全的基础知识基本定义Web安全,也称为网络安全或在线安全,是指保护网站、网页和Web服务免受各种威胁和攻击的技术和实践。这些威胁可能来自恶意软件、网络攻击、数据泄露、身份盗窃、服务中断等。Web安全的目标是确保Web应用程序和用户数据的安全、完整和可用性。一般流程......
  • joi2022_yo2_c 国土分割 (Land Division) 题解
    国土分割(LandDivision)推销我的洛谷博客。题意给定一个\(n\timesm\)的矩阵\(a\),你需要选择在横向或纵向分割至少一次,使得每个分割出来的小矩阵的\(a_{i,j}\)之和相等。数据范围\(1\leqslantn,m\leqslant50\)。\(1\leqslanta_{i,j}\leqslant10^5\)。思......
  • 【goreplay】python简单使用goreplay中间件功能
    一、场景   流量录制,需要对播放的流量进程定制化处理,那么可以使用中间件来实现  二、官网https://pypi.org/project/gor/  三、编写中间件代码#coding:utf-8importsysfromgor.middlewareimportAsyncioGordefon_request(proxy,msg,**kwargs):......
  • [转]MQ详解以及各种消息中间件说明
    转自:https://blog.csdn.net/forebe/article/details/117993082 消息中间件相关知识1、概述消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间......
  • 14-48 剑和诗人22 - RAG 的主要痛点和解决方案
    ​​​​​检索增强生成(RAG)模型已成为一种有前途的方法,它利用存储在文档中的外部知识来提高生成文本的准确性和相关性。通过检索和调节相关的上下文文档,与传统语言模型相比,RAG模型可以产生更真实、更深入和更具体的响应。然而,与任何新技术一样,RAG模型也面临着一系列......
  • P3022 [USACO11OPEN] Odd degrees G
    P3022[USACO11OPEN]OdddegreesG构造每个连通块独立,考虑其中一个如何构造。因为无向图的度数一定是偶数,而每个点的度数是奇数,所以点数为奇数,否则无解。考虑建dfs树,不关心非树边,只考虑树边的取舍构造。自底向上构造,假如当前\(u\)的儿子\(v\)为偶数,那么就不能取\((u,v)......
  • 在openEuler 22.03上使用yum安装PostgreSQL单机环境
    环境申请由于环境要国产化,选择openEuler22.03LTS系统,这里测试一下在openEuler上安装PG,过程如下。代码语言:javascript复制dockerrm-flhropeneuler22dockerrun-itd--namelhropeneuler22-hlhropeneuler22\-p15432:5432-p7389:3389\--privileged=true......
  • 代码随想录算法训练营第27天 | 122.买卖股票的最佳时机 II 55. 跳跃游戏 1005.K次取反
    122.买卖股票的最佳时机II给你一个整数数组prices,其中prices[i]表示某支股票第i天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候最多只能持有一股股票。你也可以先购买,然后在同一天出售。返回你能获得的最大利润。解题:思路:最终利润是可......
  • 最简 INA226 写寄存器的代码
    #include"hardware/i2c.h"#include"pico/binary_info.h"#defineI2C_SDA16#defineI2C_SCL17voidsetup(){//putyoursetupcodehere,torunonce:Serial.begin(115200);i2c_init(i2c_default,100*1000);gpio_set_functio......
  • CSCI-GA.2250-001 Scheduler
    ProgrammingAssignment#2(Lab2):Scheduler/DispatcherClassCSCI-GA.2250-001Summ2024In  this  lab  we  explore  the  implementation  and  effects  of different  scheduling policies  discussed  in  class  on  a  set......