django中间件三个需要了解的方法

1.process_view
路由匹配成功之后执行视图函数/类之前自动触发(顺序同process_request)
2.process_exception
视图函数/类执行报错自动触发(顺序同process_response)
3.process_template_response
视图函数/类返回的HttpResponse对象含有render并且对应一个方法的时候自动触发(顺序同process_response)

首先自定义中间件:

定义完之后要对中间件进行注册。

process_view

process_view何时触发:

路由匹配成功之后,执行视图函数/类之前自动触发。(顺序同process_request,经过每一个中间件。)

执行顺序:

process_exception

在类中添加此方法:

process_exception何时触发:

如下图可见此方法在正常的一次请求流程中不会触发:

exception和异常相关。当执行视图函数的时候报错了,自动触发。

注意是从下往上执行,process_exception的形参接受视图函数的报错信息。

process_template_response

注意:参数有response的都要使用return进行返回。

执行顺序:

可发现在正常的一次请求流程中此方法没有执行。

process_template_responsed方法的执行条件:

视图函数、视图类返回的Httpresponse对象含有render属性,并且render属性对应一个render方法的时候自动触发。

示例:

基于django中间件实现功能的插拔式设计

将各个功能制作成配置文件的字符串形式
如果想拥有该功能就编写对应的字符串
如果不想有该功能则注释掉对应的字符串 补充知识
如果利用字符串导入模块
import importlib
s1 = 'bbb.b' # aaa.bbb.ccc.b
res = importlib.import_module(s1) # from aaa.bbb.ccc import b
print(res) # <module 'bbb.b' from 'D:\\pythonProject03\\djangomiddle\\bbb\\b.py'>
'''注意字符串的结尾最小单位只能是py文件 不能是py文件里面的变量名'''
思考django中间件是如何处理的(最小单位是类名) 需求分析
模拟编写一个消息通知功能(微信、qq、邮箱) 方式1:基于函数封装的版本
没有眼前一亮的感觉 很一般
方式2:基于django中间件的功能设计
眼前一亮 回味无穷

django中间件中每个字符串都代表特定的功能。

这就叫功能的插拔式设计。

也就是说写字符串相当于导入了某个模块:

正常情况下导模块需要用到import句式:

示例:

importlib模块

importlib模块支持传递字符串来导入模块。

如下使用importlib模块与使用import句式会获得相同的结果。

使用importlib模块:

使用from ... import ...句式:

更多例子:

import importlib
import b
str_module = 'b'
res = importlib.import_module(str_module)
print(type(res)) # <class 'module'>
print(type(b)) # <class 'module'>

importlib模块底层原理:

将字符串按照点切割:

importlib中的字符串的结尾最小单位只能到py文件名,而不能是py文件的的某个变量名。

如下图desc是b.py文件中的变量名:

需求分析:

编写一个消息通知功能(微信、qq、邮箱都会收到消息)。

方式1:基于函数封装

每个功能都写一个函数:

封装总方法:

方式2:基于django中间件的功能设计

创建配置文件settings.py、启动文件start.py。再创建三个功能文件放入notify目录。

实现功能拆分,进行解耦合。

email功能文件下,写一个功能类:

核心功能函数send_msg:

不同的类,当有相同的功能时,他们的名字也应该相同(多态性):

只要发消息,就使用send_msg方法。

编写settings.py:

思考django中间件是如何处理的:

notify是一个包,在start.py导入包名notify:

导入包名notify实际是导入的包中的__init__文件。

start.py文件中,执行settings定义的函数send_all:

__init__文件中导入settings.py文件内的列表:

for循环取出列表中的字符串,并使用rsplit方法做切分:

得到用字符串表示模块路径、模块中的类名:

使用importlib模块的功能,通过字符串获得模块类型:

由于模块也是对象,通过反射从模块中拿名字:(也就是拿到真正的类)

类名加括号产生对象:

这个对象里面就有send_msg方法了,调用send_msg传入参数,实现功能。

csrf跨站请求伪造

钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但是操作的结果会影响到用户正常的网站账户 但是其中有一些猫腻
eg:英语四六级考试需要网上先缴费 但是你会发现卡里的钱扣了但是却交到了一个莫名其妙的账户 并不是真正的四六级官方账户 模拟钓鱼网站案例:转账案例
内部隐藏标签 思考:作为网站的开发者如何区分真假网站页面发送的请求

了解更多:https://blog.csdn.net/qq_45803593/article/details/124727762

csrf校验策略

我们的网站无法识别哪些请求自己内部的页面发送过来的,哪些请求是钓鱼网站发过来的。

解决办法:在提交数据的位置添加唯一标识

1.form表单csrf策略

form表单内部添加 {% csrf_token %}

示例:

查看表单的变化:

每次刷新时这个value值都会变化。后端通过这个唯一标识,来区分真网站和钓鱼网站。

2.ajax请求csrf策略

csrf会导致ajax请求无法发送。

点击按钮发送ajax请求:

无法通过crsf校验:

你只要朝服务端发请求,请求里就必须含有crsf相关的键值对。

方式1:标签查找

data:{'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},

通过标签查找,获取{% csrf_token %}产生的标签的value值:

方式2:利用模板语法自动获取

   data:{ 'csrfmiddlewaretoken':'{{ csrf_token }}','username':'jason'},

'''注意:一定要用引号引起来'''

示例:

方式3:引入官网js脚本

当前后端分离时,没有模板语法,所以可以使用官网js脚本。

在django静态文件里,添加如下js脚本:

function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
} $.ajaxSetup({
beforeSend: function (xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});

在页面上把这个静态文件加载过来即可(脚本名字可以自定义):

csrf相关装饰器

在使用csrf校验时,我们可能会遇到如下两种需求:

整个django项目都校验csrf 但是某些个视图函数\类不想校验
整个django项目都不校验csrf 但是某些个视图函数\类需要校验

这时候可以给视图函数、视图类添加装饰器来实现需求。

FBV添加装饰器的方式

与正常函数添加装饰器一致。

from django.views.decorators.csrf import csrf_exempt, csrf_protect
# @csrf_exempt
@csrf_protect
def transfer_func(request):pass

csrf_protect装饰的函数,添加crsf校验。

csrf_exempt装饰的函数,免除crsf校验。

CBV添加装饰器的方式

与正常情况不一样 需要注意。需要额外导入method_decorator

主要有三种方式:

from django.views.decorators.csrf import csrf_exempt, csrf_protect
rom django.utils.decorators import method_decorator # @method_decorator(csrf_protect, name='post') # 方式2:单独生效
class MyView(views.View):
@method_decorator(csrf_protect) # 方式3:整个类中生效
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs) # @method_decorator(csrf_protect) # 方式1:单独生效
def post(self, request):
return HttpResponse('from cbv post view') CBV添加装饰器时,注意有一个装饰器是特例只能有一种添加方式>>>:csrf_exempt
只有在dispatch方法添加才会生效

方式1:装饰类中方法

对被装饰的方法单独生效。

这里表示对post请求添加csrf校验。

方式2:装饰整个类

装饰整个类时,需要传入参数,申明装饰的是类中哪个方法,是需要添加csrf校验,还是免除csrf校验。

这里还是对post请求添加csrf校验。

方式3:装饰dispatch方法

我们在自己的视图类中,写一个dispatch方法,再使用super调用父类的dispatch,最后给dispatch方法添加装饰器。

装饰dispatch方法时,会对类中所有方法生效。

这里表示对视图类中所有方法都添加csrf校验。

特例 csrf_exempt

在全局crsf校验打开的情况下:我们想让我们的CBV不校验crsf。

如下图所示:csrf_exempt只有在dispatch方法添加才会生效

django中间件需要了解的方法 importlib模块 csrf校验策略 csrf相关装饰器的更多相关文章

  1. 12月23日内容总结——csrf跨站请求伪造、校验策略、相关装饰器,auth认证模块及相关操作,拓展auth_user表

    目录 一.csrf跨站请求伪造 概念引入 概念讲解 二.csrf校验策略 概念讲解 form表单操作csrf策略 ajax请求csrf策略 三.csrf相关装饰器 四.auth认证模块 五.auth认 ...

  2. csrf跨站请求伪造、csrf相关装饰器、auth认证模块、基于django中间件设计项目功能

    目录 csrf跨站请求网站 什么是csrf跨站请求网站 经典例子-钓鱼网站 模拟 如何避免这种现象(预防) 如何在django中解决这个问题 form表单 ajax csrf相关装饰器 FBV CBV ...

  3. csrf跨站请求、相关装饰器、auth模块使用

    昨日内容回顾 django操作cookie和session # 作用:就是保存用户信息,保存一系列数据,还可以做缓存 保留一段时间 # session是基于cookie工作的 1. 数据是保存在服务端 ...

  4. csrf跨站请求伪造、csrf校验策略、csrf相关装饰器、auth认证模块、auth认证相关模块及操作、扩展auth_user表

    今日内容 csrf跨站请求伪造 钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但是操作的结果会影响到用户正常的网站账户,但是其中有一些猫腻 eg:英语四六级考试需要网上先缴费,但是你会发现卡里 ...

  5. Django中的csrf相关装饰器

    切记:  这俩个装饰器不能直接加在类中函数的上方 (CBV方式) csrf_exempt除了,csrf_protect受保护的   from django.views import Viewfrom ...

  6. Django-中间件-csrf扩展请求伪造拦截中间件-Django Auth模块使用-效仿 django 中间件配置实现功能插拔式效果-09

    目录 昨日补充:将自己写的 login_auth 装饰装在 CBV 上 django 中间件 django 请求生命周期 ***** 默认中间件及其大概方法组成 中间件的执行顺序 自定义中间件探究不同 ...

  7. Django CBV装饰器 中间件 auth模块 CSRF跨站请求

    CBV添加装饰器 给CBV添加装饰器有三种方法,三种方法都需要导入模块: from django.utils.decorators import method_decorator 第一种直接在方法上面 ...

  8. django----csrf跨站请求伪造 auth组件 settings源码 importlib模块

    目录 importlib模块 csrf跨站请求伪造 form表单发送 ajax发送 csrf装饰器 auth模块 如何创建超级用户(root) 创建用户 校验用户名和密码是否正确 保存用户登录状态 判 ...

  9. day70 django中间件

    目录 一.django的七个中间件 二.如何自定义中间件 1 自定义中间件的创建方式 2 django提供自定制中间件的五个方法 2.1 必须掌握两个方法 2.2 了解方法 三.csrf跨站请求伪造校 ...

  10. Django中间件、csrf跨站请求、csrf装饰器、基于django中间件学习编程思想

    django中间件 中间件介绍 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出. ...

随机推荐

  1. 物体三维模型的构建:3DSOM软件实现侧影轮廓方法

      本文介绍基于3DSOM软件,实现侧影轮廓方法的空间三维模型重建. 目录 1 背景知识 1.1 三维信息获取方法 1.2 侧影轮廓方法原理及其流程 2 三维模型制作 2.1 马铃薯三维模型制作 2. ...

  2. Halcon、HDevelop快速入门

    ​ HDevelop基础一 HDevelop概述 HDevelop是一款机器视觉的集成开发环境.下面将对HDevelop的界面内容做一下简单的介绍. 界面介绍 打开HDevelop,将看到以下画面. ...

  3. (Good topic)快慢指针:链表的中间结点 (3.23leetcode每日打卡)

    给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点.   示例 1: 输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3, ...

  4. Markdown & typora 速查

    Markdown & typora 速查 一级标题 # 一级标题 说明:#数量表示几级标题,如二级标题为"## 二级标题",支持到6级标题,#和标题中间有一个空格 typo ...

  5. 小程序引入外部icon图标

    一.使用阿里巴巴图标库引入字体图标 阿里巴巴图标库:https://www.iconfont.cn/manage/index 选择合适的图标 收藏,在收藏中查看 选择:自己的项目 选择:第二个{fon ...

  6. [CF1854D] Michael and Hotel

    题目描述 Michael and Brian are stuck in a hotel with $ n $ rooms, numbered from $ 1 $ to $ n $ , and nee ...

  7. [ABC284G] Only Once

    Problem Statement For a sequence of length $N$, $A = (A_1,A_2,\dots,A_N)$, consisting of integers be ...

  8. Redis 学习笔记2:持久化

    目录 1 什么是持久化 1.1 aof 1.2 rdb 2 RDB持久化 2.1 RDB 是什么 2.2 手动触发 3 AOF持久化 3.1 aof 是什么 3.2 appendfile 文件说明: ...

  9. .NET开发中合理使用对象映射库,简化和提高工作效率

    前言 在日常开发中,我们常常需要将一个对象映射到另一个对象,这个过程中可能需要编写大量的重复性代码,如果每次都手动编写,不仅会影响开发效率,而且当项目越来越复杂,庞大的时候还容易出现错误.为了解决这个 ...

  10. tomcat中文乱码怎么解决

    需要修改Tomcat根目录下面的"logging.properties"文件,把所有的encoding=UTF-8的改成encodng=GBK,保存之后,重启Tomcat服务器,就 ...