首页 > 其他分享 >中间件基础

中间件基础

时间:2023-01-10 09:23:42浏览次数:35  
标签:自定义 process 中间件 基础 request django response

django中间件

img

django默认有七个中间件 并且还支持用户自定义中间件
中间件主要可以用于:网站访问频率的校验 用户权限的校验等全局类型的功能需求
  
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',
]
'''
什么时候用:全局相关功能时。
用户访问频率校验:中间件查看IP,计算访问频率。
什么是用户权限? 
在web领域中权限就是url vip才能访问某个url
没有访问某网址的权限只能买vip,
服务器给这个账号添加可以访问的路由 也就是添加权限
'''

django用字符串的形式导模块:
image-20221221230714895

查看源码发现,这些中间件都继承MiddlewareMixin,并且基本上都有process_requestprocess_response方法:
image-20221221114206515

自定义中间件

如何自定义中间件
	1.创建存储自定义中间件代码的py文件或者目录(如果中间件很多)
	2.参考自带中间件的代码编写类并继承
 	3.在类中编写五个可以自定义的方法
    	需要掌握的
        	  process_request
            	1.请求来的时候会从上往下依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过
            	2.如果该方法自己返回了HttpResponse对象那么不再往后执行而是直接原路返回
 				process_response
             	1.响应走的时候会从下往上依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过
             	2.该方法有两个先request和response 形参response指代的就是后端想要返回给前端浏览器的数据 该方法必须返回该形参 也可以替换
             '''如果在执行process_request方法的时候直接返回了HttpResponse对象那么会原路返回执行process_response 不是执行所有'''
       需要了解的
           	 process_view
            process_exception
            process_template_response
	4.一定在配置文件中注册中间件才可以生效

django支持自定义中间件,自定义中间件中支持定义五个方法。process_requestprocess_response方法也都支持自定义。

1.创建存储自定义中间件代码的py文件或者目录(如果中间件很多)

image-20221221120057551

2.参考自带中间件的代码编写类并继承
image-20221221231531583

3.在类中编写五个可以自定义的方法

需要掌握的:
    process_request
    process_response
需要了解的:	
    process_view
    process_exception
    process_template_response

从上往下重要程度依次降低。
中间件要在settings注册之后才能生效:
image-20221221120549270

process_request

当向服务端发送请求,请求的途径路线及顺序:

image-20221221120811194

请求来的时候 会从上往下依次经过每个中间件的 process_request方法。
image-20221221231952956

当这些process_request方法全部执行完,才能进入路由层,进入视图层。
中间件中,也能获取到request对象的所有数据:
image-20221221232139723

可以进行各种操作,添加逻辑等。

如果process_request方法自己返回了Httpresponse对象。
image-20221221121325928

就会让请求原路返回,不能继续进入下一个中间件。

process_response

process_response需要两个形参:requestresponse

image-20221221121710323

并且如果形参里携带response就必须要把这个responce返回。

请求来了之后查看执行顺序:
image-20221221121724555

响应走的时候会从下往上依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过。

image-20221221233957539

形参response指代的就是后端想要返回给前端浏览器的数据。后端发送的数据,会赋值给中间件的response。如果某个中间件不返回response,后面的中间件也就拿不到response,最后服务器也不会返回响应。

可以在中间件玩狸猫换太子:
在中间件进行一些额外的操作,修改后端返回的数据,也就是用中间件的response代替视图函数的HttpResponse。

特殊情况:
请求经过process_request方法时,process_request直接拒绝该请求,不让其进入下一个中间件。那此时响应会如何发送回客户端?

中间件响应的返回方式

两种方式:
1.执行拒绝该请求的中间件的process_response,以及上面中间件的process_response
2.执行所有的process_response

image-20221221122251040

这个操作在不同的框架里是不一样的。

在django里面是第一种方式:

在中间件001被拒绝,就从中间件001的process_response返回:image-20221221122406874

基于当前中间件的process_response原路返回
对于flask会执行所有中间件的process_response。

标签:自定义,process,中间件,基础,request,django,response
From: https://www.cnblogs.com/passion2021/p/17039107.html

相关文章

  • seo基础
    基本概念搜索引擎优化(SearchEngine Optimization,简称SEO),指在了解搜索引擎自然搜索机制的基础之上,对网站进行内部及外部的调整优化,改进网站在搜索引擎中关键字的自然排......
  • web基础概念
    01.万维网www其实是WorldWideWeb 的缩写,它是一个由许多互相链接的超文本组成的系统,通过互联网访问。在汉语中,www被翻译成“万维网”。www由两部分构成:www客户......
  • Linux基础介绍
    Linux基础介绍一、运维的本质运维:运行维护应用程序岗位需求:自动化运维、DBA、docker+K8s运维的本质: 1.尽可能保证应用程序24小时不间断运行2.尽可能保证数据的......
  • noi 1.13编程基础之综合应用 02:不吉利日期
    总时间限制:1000ms内存限制:65536kB描述在国外,每月的13号和每周的星期5都是不吉利的。特别是当13号那天恰好是星期5时,更不吉利。已知某年的一月一日是星期w,并且这一年......
  • Win10基础 AIDA64 查看电脑的配置报告
          OS:Windows10Version22H2      blog:师万物 typesetting:Markdown AIDA64查看电脑的配置报告喜欢研究电脑硬件的同学,可以使用相关......
  • Win10基础 AIDA64 查看硬件的温度与电压
          OS:Windows10Version22H2      blog:师万物 typesetting:Markdown AIDA64查看硬件的温度与电压计算机-传感器在排查电脑运行......
  • linux-基础及相关软件安装
    1.linux常见岗位自动化运维、容器运维、DBAps:会的越多给的就越多!!!"""IDC运维:机房运维员不要做!!!"""2.计算机的种类台式机笔记本服务器 作⽤:......
  • linux基础:1、linux简介、虚拟化软件的安装与配置、Xshell的安装与配置
    Linux目录Linux一、linux简介二、linux发展史三、虚拟化技术1、简介2、虚拟化软件下载3、重要名词解释4、远程链接工具一、linux简介常见岗位1、自动化运维2、容器......
  • 【java基础】创建不可变集合
    创建不可变集合List<Integer>list=List.of(1,2,3,4);//[1,2,3,4]Set<Integer>set=Set.of(1,2,3,4);//[1,2,3,4]Map<Integer,Integer>map=Map.of(1,2,3,4);//{1......
  • 【java基础】如何创建20元素以上的不可变集合?(Map.of()无法创建20个以上)
    背景由于Map.of()(jdk-9出现)创建的不可变集合无法超过20个参数,所以可以使用下面的办法创建Map<Object,Object>map=Map.ofEntries(hm.entrySet().toArray(newMap.Entry......