Django之中间件与CSRF_TOKEN

文章目录

  • 一、什么是中间件
  • 二、中间件有什么用
  • 三、Django自定义中间件
    • 中间件中主要方法及作用
    • `创建自定义中间件的步骤:`
    • process_request与process_response方法
    • process_view方法
    • process_exception
    • process_template_response(不常用)
  • 四、CSRF_TOKEN

流程图介绍中间件
在这里插入图片描述

一、什么是中间件

Django中间件类似于django的门户,所有的请求来和响应走走必须经过中间件

中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能

Django官方中间件的定义:

	Middleware is a framework of hooks into Django’s request/response processing. It’s a light, low-level “plugin” system for globally altering Django’s input or output.

中间件它的执行位置在web服务网关接口之后,在路由匹配之前执行的

二、中间件有什么用

如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。

可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。

Django默认的中间件:(在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下)

	'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',]

1.django.middleware.security.SecurityMiddleware

做了一些安全处理的中间件。比如设置XSS防御的请求头,比如做了http协议转为https协议的工作等。

2.django.contrib.sessions.middleware.SessionMiddleware

session中间件。会给request添加一个处理好的session对象。

3.django.middleware.common.CommonMiddleware

通用中间件,会处理一些URL,比如baidu.com会自动的处理成www.baidu.com。

4.django.middleware.csrf.CsrfViewMiddleware

保护中间件,在提交表单的时候必须加入csrf_token,cookie中也会生成一个名叫csrftoken的值,也会在header中加入一个HTTP_X_CSRFTOKEN的值来放置CSRF攻击。SessionMiddleware必须出现在CsrfMiddleware之前。

5.django.contrib.auth.middleware.AuthenticationMiddleware

用户授权中间件。会给reqeust添加一个user对象的中间件。该中间件必须在sessionmiddleware后面。

6.django.contrib.messages.middleware.MessageMiddleware

消息处理中间件。为了在多个模版中可以使用我们返回给模版的变量,并且简化操作。

7.django.middleware.clickjacking.XFrameOptionsMiddleware

防止通过浏览器页面跨Frame出现clickjacking(欺骗点击)攻击出现。

中间件的执行顺序
在这里插入图片描述

每一个中间件在请求来的时候或者响应的时候都具有一定的作用。


三、Django自定义中间件

Django给我们提供了创建自定义中间件的方式,通过创建自定义中间件来实现全局的功能,例如全局用户黑名单校验、全局用户访问频率校验、网站全局用户身份校验等等。

中间件中主要方法及作用

	'中间件类必须继承自django.utils.deprecation.MiddlewareMixin类'process_request(self,request)用途:过滤请求'''1.请求来的时候会按照配置文件中注册了的中间件,从上往下依次执行每一个中间件里面的porcess_request方法,如果没有则直接跳过2.该方法如果返回了HttpResponse对象,那么请求不会再往后执行,原路返回'''process_view(self, request, callback, callback_args, callback_kwargs)用途:用于代码层面的替换和过滤,这个方法可以拿到视图函数的参数'''当路由匹配成功之后,执行视图函数之前,自动触发'''process_template_response(self,request,response)'''当视图函数返回的数据对象中含有render属性对应render函数才会触发'''process_exception(self, request, exception)用途:用于一般用于捕获发生的异常,并将其邮件发送给开发人员'''当视图函数报错之后,自动触发'''process_response(self, request, response)'''1.响应走的时候会按照配置文件中注册了的中间件,从下往上依次执行每一个中间件里面的process_response方法,如果没有则直接跳过2.该方法有两个形参request和response,并且默认情况下应该返回response3.该方法也可以自己返回HttpResponse对象,相当于狸猫换太子'''
'如果请求的过程中process_request方法直接返回了HttpResponse对象那么会原地执行同级别process_response返回后直接返回(flask则不同)'

创建自定义中间件的步骤:

	1.在项目名下或者任意的应用名下创建一个文件夹2.在该文件夹内创建一个任意名称的py文件3.在该py文件中编写一个自定义的中间件类,并且必须继承MiddlewareMixin4.紧接着去settings配置文件中注册中间件

process_request与process_response方法

当用户发起请求的时候会依次执行经过的所有中间件,这个时候的请求首先进入process_request,最后到达views的函数中,views函数处理后,在依次穿过中间件,这个时候是process_response,最后返回给请求者。

我们要自己定义中间件的话,需要写一个类,并且继承MiddlewareMixin

	from django.utils.deprecation import MiddlewareMixin

第一步:需要建立一个py文件夹来编写我们自定义的中间件,建议在应用层下面创建。
app-------》Middleware-----》middle.py

	from django.utils.deprecation import MiddlewareMixinclass MyMiddleware1(MiddlewareMixin):def process_request(self,request):print('这是第一个中间件的process_request')def process_response(self,request,response):  # 响应print('这是第一个中间件的process_response')return responseclass MyMiddleware2(MiddlewareMixin):def process_request(self,request):print('这是第二个中间件的process_request')def process_response(self,request,response):  # 响应print('这是第二个中间件的process_response')return response

第二步:在settings.py文件里面加入我们自定义的中间件

	MIDDLEWARE = [# settings这个列表中存储的其实就是一个个中间件的路径'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',#下面两个就是自定义的中间件路径地址'app.Middleware.middle.MyMiddleware1','app.Middleware.middle.MyMiddleware2',]

第三步:定义视图函数

	'记得别忘记配置路由'def func(request):print('from func')return HttpResponse('from func')

当我们浏览器朝服务端发送请求,必定会经过我们刚才定义的中间件
在这里插入图片描述

process_request方法的request则是请求,response则是视图函数返回的内容到了中间件里面,然后由中间件return出去。所以我们是可以在process_response里面不写return视图函数返回的内容,自己定义内容返回。


从下图看,正常的情况下按照绿色的路线进行执行,假设中间件1有返回值,则按照红色的路线走,直接执行该类下的process_response方法返回,后面的其他中间件就不会执行。
在这里插入图片描述

也就是说中间件的process_request方法使用了return,那么其后面的中间件将不再执行,直接执行该中间件和其上面中间件的process_response方法,最终将某个process_request里面的return值返回给请求者。

由此总结:

  • 中间件的process_request方法是在执行视图函数之前执行的。
  • 当配置多个中间件时,会按照MIDDLEWARE中的注册顺序,也就是列表的索引值,从前到后依次执行的。
  • 不同中间件之间传递的request都是同一个对象

多个中间件中的process_response方法是按照MIDDLEWARE中的注册顺序倒序执行的,也就是说第一个中间件的process_request方法首先执行,而它的process_response方法最后执行,最后一个中间件的process_request方法最后一个执行,它的process_response方法是最先执行的。


process_view方法

该方法格式:process_view(request, view_func, view_args, view_kwargs)

process_view方法的四个参数:

  • request:HTTPRequest对象
  • view_func:Django即将调用的视图函数
  • view_args:将传递给视图的位置参数的元组
  • view_kwargs:是将传递给视图的关键字参数的字典

view_args和view_kwargs都不包含第一个视图函数(request)

process_view方法是在视图函数之前,process_request方法之后执行的。

它应该返回None或一个HttpResponse对象,如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。如果它返回一个HttpResponse对象,Django不会调用适当的视图函数。它将执行中间件的process_response方法并将应用到该HttpResponse并返回结果。

自定义中间件:

	记得需要注册自定义中间件from django.utils.deprecation import MiddlewareMixinclass Md1(MiddlewareMixin):def process_request(self,request):print('M1请求来时,校验')def process_response(self,reqeust,response):print('M1返回数据时,对数据进行处理')return responsedef process_view(self,request,view_func,view_args,view_kwargs):print('我在只给你view函数前执行!')class Md2(MiddlewareMixin):def process_reqeust(self,request):print('M2请求来时,校验')def process_response(self,request,response):print('M2返回数据时,对数据进行处理')return responsedef process_view(self,request,view_func,view_args,view_kwargs):pass执行结果》》》》:M1请求来时,校验我在只给你view函数前执行!from funcM2返回数据时,对数据进行处理M1返回数据时,对数据进行处理

下图分析上面代码的执行过程:
在这里插入图片描述

当最后一个中间件的process_reqeust到达路由关系映射之后,返回到中间件1的process_view,然后依次往下,到达views函数,最后通过process_response依次返回到达用户。

注意:process_view如果有返回值,会越过其他的process_view以及视图函数,但是所有的process_response都还会执行。


process_exception

process_exception(self, request, exception)

该方法两个参数:

  • 一个HttpRequest对象
  • 一个exception是视图函数异常产生的Exception对象。

这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。

视图函数制造错误

	def index(request):print('index视图函数执行了')lis = [1,2,3]lis[4]

自定义中间件:

	class Md1(MiddlewareMixin):def process_request(self,request):print("Md1请求")def process_response(self,request,response):print("Md1返回")return responsedef process_view(self, request, callback, callback_args, callback_kwargs):print("md1 process_view...")def process_exception(self,request,exception):print("md1 process_exception...")class Md2(MiddlewareMixin):def process_request(self,request):print("Md2请求")def process_response(self,request,response):print("Md2返回")print(response.content)return responsedef process_view(self, request, view_func, view_args, view_kwargs):print("md2 process_view...")def process_exception(self, request, exception):print("md2 process_exception...")return HttpResponse(exception)执行结果》》》》:Md1请求Md2请求md1 process_view...md2 process_view...index视图函数执行了md2 process_exception...Md2返回b'list index out of range'Md1返回

当process_exception进行return HttpResponse后,process_response方法就会拿到其返回的数据。

当views出现错误时流程图如下:
在这里插入图片描述

process_template_response(不常用)

该方法对视图函数返回值有要求,必须是一个含有render方法类的对象,才会执行此方法。

process_template_response 函数是在视图函数执行完后立即执行的

视图

	def index(request):print("这里是 index 页面")repsponse = HttpResponse("这里是主页面 index")def render():print("这里是 index 函数里的 render 方法")return HttpResponse("index")repsponse.render = renderreturn repsponse

自定义中间件

	class Md2(MiddlewareMixin):def process_request(self,request):print("Md2请求")def process_response(self,request,response):print("Md2返回")return responsedef process_view(self, request, view_func, view_args, view_kwargs):print(view_func)print("md2 process_view...")def process_template_response(self, request, response):print("视图函数执行完毕,且返回了render")return response执行结果》》》》:Md2请求md2 process_view...这里是 index 页面视图函数执行完毕,且返回了render这里是 index 函数里的 render 方法Md2返回

四、CSRF_TOKEN

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

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

相关文章

mysql latin-1报错解决

conn pymysql.connect(hostmeta_conf[host], usermeta_conf[user], passwordmeta_conf[password], portmeta_conf[port], charsetutf8) 光把表声明 ENGINEINNODB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_bin ROW_FORMATDYNAMIC 并不能解决这个报错,需要在创建mysql连接时候…

面试:RabbitMQ相关问题

文章目录 简单介绍RabbitMQRabbitMQ架构什么是 RabbitMQ?有什么显著的特点?RabbitMQ 有那些基本概念?RabbitMQ routing 路由模式消息怎么路由?RabbitMQ publish/subscribe 发布订阅(共享资源)能够在地理上分开的不同数据中心使用 …

vue2指令的使用和自定义指令

前言 个人认为vue的指令,对比react来说,给开发者节省了很大的学习成本。比如在react中,你想渲染一个列表,需要用Array.map的方法return<div>,而在vue中,一个简单的v-for就解决了问题。 在学习成本和入手体验上,vue的作者确实后来者居上,能让人更快的使用vue开发。不过也…

无边界电视点播TVbox壳+源

TBBox可以是个盒子也可以是软件 视频播放的困局新的改变TVBox apk更成熟的熊猫宝盒_3.10还有这个没测试恒星TV 写在最后 视频播放的困局 现在电视上几大平台看剧集都要充会员&#xff0c;而电脑上网页端有很多可以看的网页&#xff0c;只有 随便一搜就测出来&#xff0c;只是经…

数据安全第一:应对[[MyFile@waifu.club]].wis勒索病毒的实用建议与技巧

引言&#xff1a; 在当今数字化时代&#xff0c;[[MyFilewaifu.club]].wis、[[backupwaifu.club]].wis勒索病毒是一种恶意软件&#xff0c;其危害用户数据安全&#xff0c;通过加密文件并勒索赎金来获取经济利益。以下是对[[MyFilewaifu.club]].wis、[[backupwaifu.club]].wis…

PyTorch包

进入PyTorch的官网&#xff1a; pytorch GitHub 点击GitHub&#xff1a; 进入PyTorch的主目录&#xff1a; 进入Vision reference&#xff1a; detection&#xff1a; 这就是我们在训练过程中会使用到的文件了&#xff1a;

objdump反汇编文件解析

命令使用 objdump可以对可执行文件进行反汇编 其常用参数为: objdump -d <file(s)>: 将代码段反汇编&#xff1b;objdump -S <file(s)>: 将代码段反汇编的同时&#xff0c;将反汇编代码与源代码交替显示&#xff0c;编译时需要使用-g参数&#xff0c;即需要调试信…

Hadoop技术与应用的习题

第一章测验 1、下面哪个选项不属于Google的三驾马车&#xff1f; A.HDFS B.MapReduce C.BigTable D.GFS 2、下面哪个思想是为了解决PageRank&#xff08;网页排名&#xff09;的问题&#xff1f; A.GFS B.BigTable C.MapReduce D.YARN 3、GFS 存储的文件都被分割成固定大小的…

CAN基础知识

CAN 简介 CAN 是 Controller Area Network 的缩写&#xff08;以下称为 CAN&#xff09;&#xff0c;是 ISO 国际标准化的串行通信 协议。在当前的汽车产业中&#xff0c;出于对安全性、舒适性、方便性、低公害、低成本的要求&#xff0c;各种 各样的电子控制系统被开发了出来…

简单的用Python采集股票数据,保存表格后分析历史数据

前言 字节跳动如果上市&#xff0c;那么钟老板将成为我国第一个世界首富 趁着现在还没上市&#xff0c;咱们提前学习一下用Python分析股票历史数据&#xff0c;抱住粗大腿坐等起飞~ 好了话不多说&#xff0c;我们直接开始正文 准备工作 环境使用 Python 3.10 解释器Pychar…

如何应用ChatGPT撰写、修改论文及工作报告,提供写作能力及优化工作??

如果我想让gpt从pdf文档中提取相关关键词的内容&#xff0c;可以怎么做呢&#xff1f;&#xff1f;我们评论区讨论 ChatGPT 在论文写作与编程方面也具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题&#xff0c;ChatGPT都能为您提供实用且高质量的建议和指导&am…

爱上C语言:scanf、gets以及getchar输入字符串你真的懂了吗

&#x1f680; 作者&#xff1a;阿辉不一般 &#x1f680; 你说呢&#xff1a;不服输的你&#xff0c;他们拿什么赢 &#x1f680; 专栏&#xff1a;爱上C语言 &#x1f680;作图工具&#xff1a;draw.io(免费开源的作图网站) 如果觉得文章对你有帮助的话&#xff0c;还请点赞…

通过ros系统中websocket中发送sensor_msgs::Image数据给web端显示

通过ros系统中websocket中发送sensor_msgs::Image数据给web端显示 #include <ros/ros.h> #include <signal.h> #include <sensor_msgs/Image.h> #include <message_filters/subscriber.h> #include <message_filters/synchronizer.h> #include &…

spring 是如何开启事务的, 核心原理是什么

文章目录 spring 是如何开启事务的核心原理1 基于注解开启事务2 基于代码来开启事务 spring 是如何开启事务的 核心原理 Spring事务管理的实现有许多细节&#xff0c;如果对整个接口框架有个大体了解会非常有利于我们理解事务&#xff0c;下面通过讲解Spring的事务接口来了解…

建行广东省江门市分行走进农村地区开展反假货币宣传

人民对美好生活的向往&#xff0c;涉及方方面面&#xff0c;小至“钱袋子”安全。建行广东省江门市分行落实当地监管部门部署&#xff0c;积极扛起维护国家金融安全的重要政治责任&#xff0c;深入农村地区开展反假货币宣传工作&#xff0c;助力构建农村反假货币工作长效机制。…

Hyper-V系列:windows11开启系统自带安卓虚拟机并安装apk包

本文记录了Windows11系统下开启系统自带的安卓虚拟机,并通过安装包安装自定义应用的过程。开启系统自带的安卓虚拟机流程为:开启Hyper-V、安装Windows11子系统;安装apk安装包的流程为:安装adb调试工具、开启子系统的开发者模式、安装apk应用包。 一. 开启Hyper-V Hyper-V…

[BJDCTF2020]The mystery of ip1

提示 ssti模板注入head头x-forwarded-for 每一次做题的最开始流程都大致因该是 信息收集找可以操控的地方 查看hint页面的源代码又发现它提示说 ####你知道为什么会知道你的ip吗 查看flag页面 从刚才给我的提示以及他这里显示的我的ip&#xff0c;大概找到了我可操作的可控点 …

【Vue】创建第一个实例

步骤&#xff1a; 1.创建容器 2.引包 3.创建实例 4.添加配置项 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><!--准备容器 --> <di…

【C语言:深入理解指针二】

文章目录 1. 二级指针2. 指针数组3. 字符指针变量4. 数组指针变量5. 二维数组传参的本质6. 函数指针变量7. 函数指针数组8. 转移表9. 回调函数10. qsort函数的使用与模拟实现 1. 二级指针 我们知道&#xff0c;指针变量也是变量&#xff0c;它也有自己的地址&#xff0c;使用什…

【面试】jvm中堆是分配对象存储的唯一选择吗

目录 一、说明二、逃逸分析2.1 说明2.2 参数设置 一、说明 1.在《深入理解Java虚拟机》中关于Java堆内存有这样一段描述:随着JIT编译期的发展与逃逸分析技术逐渐成熟&#xff0c;栈上分配、标量替换优化技术将会导致一些微妙的变化&#xff0c;所有的对象都分配到堆上也渐渐变得…