day71---日考

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上
原文地址:https://www.cnblogs.com/surpass123/p/13070265.html