day71日考题
考题
"""
今日考题
1.什么是django中间件,它的作用是什么,如何自定义中间件,里面有哪些用户可以自定义的方法,这些方法有何特点
2.基于django中间件的功能设计,你有啥感悟和心得
3.什么是跨站请求伪造,你可以用一个具体的实例描述一下,django中如何防止及通过跨站请求伪造校验(form表单与ajax)
4.跨站请求伪造相关的装饰器有哪些,应用在FBV与CBV上的有什么异同
"""
1.什么是django中间件,它的作用是什么,如何自定义中间件,里面有哪些用户可以自定义的方法,这些方法有何特点。
django中间件是用来处理框架中的请求和响应的钩子,即可以在执行视图函数之前或者之后做一些额外的操作。
# 自定义中间件的步骤
(1)在项目或者应用的下面创建名称为任意名字的文件夹,如‘mymiddleware’,
(2)在该文件夹下创建任意名字的py文件,如‘auths.py’,
(3)在py文件中书写类,所书写的类必须继承于`MiddlewareMixin`,
(4)将其注册到settings.py中的MIDDLEWARE列表中,如:
MIDDLEWARE=[
...,
# 自定义中间件
'app01.mymiddleware.auths.Login',
'app01.mymiddleware.auths.Resgister',
]
# process_request(self,request)
(1)process_request在执行视图函数之前执行;
(2)有多个中间件时,按照MIDDLEWARE中的注册顺序依次执行(自上而下);
(3)如果某个中间件没有该方法则跳过,继续执行下一个中间件;
(4)process_request的返回值可以是None,也可以是HttpResponse对象,如果是None,继续处理django请求,执行下一个中间件的process_request,如果是HttpResponse对象,原路返回;
(5)不同中间件之间传递的request对象是一样的(除非你人为修改了)
#process_response(self,request,response)
(1)process_resposne在执行视图函数之后执行;
(2)有多个中间件时,按照MIDDLEWARE中的注册顺序倒序执行(自下而上);
(3)如果某个中间件没有该方法则跳过,继续执行下一个中间件;
(4)process_response的response参数是视图函数返回的HttpResponse对象
注意:当process_request返回一个HttpResponse对象后会直接走同级别的process_response方法,不会执行其他的process_response。但是在flask框架中,会将所有的类似django中的process_response方法都走一遍
#process_view
在路由匹配成功之后,执行视图函数之前执行
执行顺序是,按照MIDDLEWARE中的注册顺序依次执行(自上而下)
#process_exception
在执行视图函数过程抛出了异常执行
执行顺序是,按照MIDDLEWARE中的注册顺序倒序执行(自下而上);
#process_template_response
视图函数返回的HttpResponse对象具有render属性触发,用的不多
执行顺序是,按照MIDDLEWARE中的注册顺序倒序执行(自下而上);
2.基于django中间件的功能设计,你有啥感悟和心得
得出一个重要的编程思想:模块的动态导入+反射+多态(鸭子类型)
django中间件的增加和取消使用配置文件,在配置文件中增加和注释就可以实现,这种可插拔式了编程思想极大的实现了功能之间的解耦合性。
它内部采用模块动态导入的方式,将字符串的路径解析成模块导入是实现这种编程思想的基础。
另外,反射和面向对象的多态(鸭子类型)在这里面也发挥这重要作用。
以后,我们在项目中如果遇到类似的设计,比如功能性模块的设计,可以简介这种编程思想,方便用户模块的使用。
NOFITY_LIST = [
'notify.ali_pay.AliPay',
'notify.qq_pay.QQPay',
'notify.wechat_pay.WeChatPay'
]
for path_str in settings.NOFITY_LIST:
module_path,class_name = path_str.rsplit('.',maxsplit=1)
module = importlib.import_module(module_path) # from notify import ali_pay
if hasattr(module,class_name): # 反射
cls=getattr(module,class_name)
obj = cls() #实例化一个对象
obj.pay_all()
3.什么是跨站请求伪造,你可以用一个具体的实例描述一下,django中如何防止及通过跨站请求伪造校验(form表单与ajax)
服务端给每一个需要用户提交数据的页面一个唯一标识
当该页面提交到后端时需要校验本次提交是否携带这唯一标识,
如果携带且正确则正常进入;否则校验失败不允许访问403禁止。
比如钓鱼网站的跨站伪造请求,就是利用早期互联网在这方面的漏洞而出现的不法行为。
# 表单中csrf跨站请求伪造校验
<form actio="" method="post" novalidate>
{% csrf_token %}
</form>
# ajax处理csrf跨站请求伪造校验
<button class="btn btn-sm btn-success" type="submit" id="d1">提交<button>
<script>
let $btnEle = $('#d1');
$btnEle.on('click',function(){
$.ajax({
url:'', #不写默认朝当前地址提交
type:'post',
data:{'username':'jason_dsb','password':'dbj66'},
sucess:function(args){ #异步回调函数机制
}
});
})
</script>
# 方法1
data中添加
data:{'username':'jason_dsb','password':'dbj66','csrfmiddlewaretoken':$('[name=csrfmiddletoken]').val()},
# 方法2
data:{'username':'jason_dsb','password':'dbj66','csrfmiddlewaretoken':'{{ csrf_token }}'},
# 方法3
导入django官方处理csrf的js文件
导入路径:‘/static/js/mysetup.js’
<script src="{% static 'js/mysetup.js' %}"></script>
4.跨站请求伪造相关的装饰器有哪些,应用在FBV与CBV上的有什么异同
from django.views.decorators.csrf import csrf_protect csrf_exempt
csrf_protect 加保护
csrf_exempt 移除保护
FBV时直接加载视图函数上面
CBV时,csrf_protect三种加装饰器的方法都可以;而csrf_exempt只能加在dispatch上