django中间件需要了解的方法 importlib模块 csrf校验策略 csrf相关装饰器
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相关装饰器的更多相关文章
- 12月23日内容总结——csrf跨站请求伪造、校验策略、相关装饰器,auth认证模块及相关操作,拓展auth_user表
目录 一.csrf跨站请求伪造 概念引入 概念讲解 二.csrf校验策略 概念讲解 form表单操作csrf策略 ajax请求csrf策略 三.csrf相关装饰器 四.auth认证模块 五.auth认 ...
- csrf跨站请求伪造、csrf相关装饰器、auth认证模块、基于django中间件设计项目功能
目录 csrf跨站请求网站 什么是csrf跨站请求网站 经典例子-钓鱼网站 模拟 如何避免这种现象(预防) 如何在django中解决这个问题 form表单 ajax csrf相关装饰器 FBV CBV ...
- csrf跨站请求、相关装饰器、auth模块使用
昨日内容回顾 django操作cookie和session # 作用:就是保存用户信息,保存一系列数据,还可以做缓存 保留一段时间 # session是基于cookie工作的 1. 数据是保存在服务端 ...
- csrf跨站请求伪造、csrf校验策略、csrf相关装饰器、auth认证模块、auth认证相关模块及操作、扩展auth_user表
今日内容 csrf跨站请求伪造 钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但是操作的结果会影响到用户正常的网站账户,但是其中有一些猫腻 eg:英语四六级考试需要网上先缴费,但是你会发现卡里 ...
- Django中的csrf相关装饰器
切记: 这俩个装饰器不能直接加在类中函数的上方 (CBV方式) csrf_exempt除了,csrf_protect受保护的 from django.views import Viewfrom ...
- Django-中间件-csrf扩展请求伪造拦截中间件-Django Auth模块使用-效仿 django 中间件配置实现功能插拔式效果-09
目录 昨日补充:将自己写的 login_auth 装饰装在 CBV 上 django 中间件 django 请求生命周期 ***** 默认中间件及其大概方法组成 中间件的执行顺序 自定义中间件探究不同 ...
- Django CBV装饰器 中间件 auth模块 CSRF跨站请求
CBV添加装饰器 给CBV添加装饰器有三种方法,三种方法都需要导入模块: from django.utils.decorators import method_decorator 第一种直接在方法上面 ...
- django----csrf跨站请求伪造 auth组件 settings源码 importlib模块
目录 importlib模块 csrf跨站请求伪造 form表单发送 ajax发送 csrf装饰器 auth模块 如何创建超级用户(root) 创建用户 校验用户名和密码是否正确 保存用户登录状态 判 ...
- day70 django中间件
目录 一.django的七个中间件 二.如何自定义中间件 1 自定义中间件的创建方式 2 django提供自定制中间件的五个方法 2.1 必须掌握两个方法 2.2 了解方法 三.csrf跨站请求伪造校 ...
- Django中间件、csrf跨站请求、csrf装饰器、基于django中间件学习编程思想
django中间件 中间件介绍 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出. ...
随机推荐
- 物体三维模型的构建:3DSOM软件实现侧影轮廓方法
本文介绍基于3DSOM软件,实现侧影轮廓方法的空间三维模型重建. 目录 1 背景知识 1.1 三维信息获取方法 1.2 侧影轮廓方法原理及其流程 2 三维模型制作 2.1 马铃薯三维模型制作 2. ...
- Halcon、HDevelop快速入门
HDevelop基础一 HDevelop概述 HDevelop是一款机器视觉的集成开发环境.下面将对HDevelop的界面内容做一下简单的介绍. 界面介绍 打开HDevelop,将看到以下画面. ...
- (Good topic)快慢指针:链表的中间结点 (3.23leetcode每日打卡)
给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3, ...
- Markdown & typora 速查
Markdown & typora 速查 一级标题 # 一级标题 说明:#数量表示几级标题,如二级标题为"## 二级标题",支持到6级标题,#和标题中间有一个空格 typo ...
- 小程序引入外部icon图标
一.使用阿里巴巴图标库引入字体图标 阿里巴巴图标库:https://www.iconfont.cn/manage/index 选择合适的图标 收藏,在收藏中查看 选择:自己的项目 选择:第二个{fon ...
- [CF1854D] Michael and Hotel
题目描述 Michael and Brian are stuck in a hotel with $ n $ rooms, numbered from $ 1 $ to $ n $ , and nee ...
- [ABC284G] Only Once
Problem Statement For a sequence of length $N$, $A = (A_1,A_2,\dots,A_N)$, consisting of integers be ...
- Redis 学习笔记2:持久化
目录 1 什么是持久化 1.1 aof 1.2 rdb 2 RDB持久化 2.1 RDB 是什么 2.2 手动触发 3 AOF持久化 3.1 aof 是什么 3.2 appendfile 文件说明: ...
- .NET开发中合理使用对象映射库,简化和提高工作效率
前言 在日常开发中,我们常常需要将一个对象映射到另一个对象,这个过程中可能需要编写大量的重复性代码,如果每次都手动编写,不仅会影响开发效率,而且当项目越来越复杂,庞大的时候还容易出现错误.为了解决这个 ...
- tomcat中文乱码怎么解决
需要修改Tomcat根目录下面的"logging.properties"文件,把所有的encoding=UTF-8的改成encodng=GBK,保存之后,重启Tomcat服务器,就 ...