目 录
-
Django中间件简介
-
自定义中间件的5种方法
-
中间件的执行流程(待总结)
-
跨站请求伪造
-
-
钓鱼网站简介 钓鱼网站原理 钓鱼网站破解 案例
-
-
-
装饰器
中间件前戏图解
一、Django中间件简介
什么是中间件?
Django中间件是一个低级、轻量级的插件系统,用来处理django请求和响应的框架级别的钩子。
中间件用于在全局范围内改变django的输入和输出,每个中间件组件都负责特定的功能。
中间件的应用场景:
django中间件(******)
用户访问频率限制
用户是否是黑名单 白名单
所有用户登录校验
只要是涉及到网址全局的功能 你就应该考虑使用中间件
总结:
中间件是帮助我们在视图函数执行前和执行后做一些额外的操作。
中间件的本质就是自定义的类,类中定义了几个方法,django框架的请求在特定的时间会触发这些方法!!!
二、自定义中间件的5种方法
django中间件暴露给我们5个自定义的方法,想要自定义中间件需要以下操作:
django中间件暴露给程序员五个可以自定义的方法(五个方法都是在特定的条件下自动触发的) 1.新建一个文件夹 里面新建一个任意名称的py文件 里面写类 固定继承 from django.utils.deprecation import MiddlewareMixin class MyMiddle(MiddlewareMixin): ... 2.去配置文件注册到中间件配置中 你需要手写字符串的路径 'app01.mymiddleware.myaabb.MyMiddle1'
5个方法:
需要掌握的 process_request(******):请求来的时候 会从上往下依次经过每一个中间件里面process_request,一旦里面返回了HttpResponse对象那么就不再往后执行了 会执行同一级别的process_response def process_request(self,request): print('我是第一个自定义中间件里面的process_request方法') return HttpResponse("我是第一个自定义中间件里面的HttpResponse对象返回值") # 直接原地返回 process_response(***):响应走的时候 会从下往上依次进过每一个中间件里面的process_response def process_response(self,request,response): # response就是要返回给用户的数据 print("我是第一个自定义中间件里面的process_response方法") return response 了解的 process_view:路由匹配成功之后执行视图函数之前触发 process_exception:当视图函数出现异常(bug)的时候自动触发 process_template_response:当视图函数执行完毕之后并且返回的对象中含有render方法的情况下才会触发
总结:Django中间件5种方法
process_request
1、中间件中 process_request 方法是在视图函数之前执行的;
2、当配置多个中间件时,会按照MIDDLEWARE中中间件的注册顺序执行;
3、多个中间件之间传递的request是同一个对象。
process_response
多个中间件中process_response 方法是按照MIDDLEWARE中 中间件注册顺序倒序执行的,即第一个中间件中process_request方法先执行,
它的process_response最后执行;最后一个中间件的process_request方法最后执行,但是它的process_response方法最先开始执行。
(直白的理解:请求来的时候process_request方法按照注册顺序从头开始执行,响应走的时候process_response方法按照注册表顺序从后向前依次执行)
注意:
定义process_response方法时,必须要传入两个形参 request 和 response。其中request就是传入的对象,response参数是视图函数返回的Httpresponse对象
(由这句话可以知道,process_response方法必须要等到视图层函数执行完,也就是Django后台逻辑处理完成之后),该方法必须要有返回值,也就是Httpresponse对象(return response)。
如果不返回 response 的话,浏览器收不到django后台返回的视图,而是中间件返回的视图。
processs_view
''' process_view(self, request, view_func, view_args, view_kwargs) 该方法有四个参数 request是HttpRequest对象。 view_func是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称作为字符串。) view_args是将传递给视图的位置参数的列表. view_kwargs是将传递给视图的关键字参数的字典。 view_args和view_kwargs都不包含第一个视图参数(request)。 Django会在调用视图函数之前调用process_view方法。 它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,那么将不会执行Django的视图函数,而是直接在中间件中掉头,倒叙执行一个个process_response方法,最后返回给浏览器 '''
注意:
process_view方法是在Django路由系统(urls.py)之后,视图系统之前(views.py)之前执行的,按照MIDDLEWARE中间件的注册顺序从前向后一次执行!
process_exception
''' process_exception(self, request, exception) 该方法两个参数: 一个HttpRequest对象 一个exception是视图函数异常产生的Exception对象。 这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。 '''
注意:
processs_exception方法只有在视图函数出现异常的时候才会触发,如果没有异常该方法不会执行。
process_template_response
''' process_template_response(self, request, response) 它的参数,一个HttpRequest对象,response是TemplateResponse对象(由视图函数或者中间件产生)。 process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)。 '''
跨站请求伪造
1、简介
跨站请求伪造(csrf) 钓鱼网站
就类似于你搭建了一个跟银行一模一样的web页面
用户在你的网站转账的时候输入用户名 密码 对方账户
银行里面的钱确实少了 但是发现收款人变了
2、原理
最简单的原理
你写的form表单中 用户的用户名 密码都会真实的提交给银行后台
但是收款人的账户却不是用户填的 你暴露给用户的是一个没有name属性的input框
你自己提前写好了一个隐藏的带有name和value的input框
3、解决策略
解决钓鱼网站的策略
只要是用户想要提交post请求的页面 我在返回给用户的时候就提前设置好一个随机字符串
当用户提交post请求的时候 我会自动先取查找是否有该随机字符串
如果有 正常提交
如果没有 直接报403
案例:模拟钓鱼网站
启动两个不同的Django项目,分别配置相应的views.py 中 transfer函数。。。。。。具体操作可参考视频作业!!!
如何解决提价POST请求Crsf中间件会报错的问题?
form表单
你在写的时候只需要加上一个
{% csrf_token %}
ajax 第一种 自己再页面上先通过{% csrf_token %}获取到随机字符串 然后利用标签查找 data:{'username':'jason','csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()}, 第二种 data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'}, 第三种 拷贝js文件
装饰器
装饰器 csrf_exempt 只有两种装饰的方式 from django.views.decorators.csrf import csrf_exempt, csrf_protect from django.utils.decorators import method_decorator # 第一种 # @method_decorator(csrf_exempt,name='dispatch') class MyCsrf(View): # 第二种 @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super().dispatch(request,*args,**kwargs) def get(self,request): return HttpResponse('hahaha') 除了csrf_exempt之外 所有的其他装饰器 在CBV上面都有三种方式 @method_decorator(csrf_protect,name='post') class MyCsrf(View): @method_decorator(csrf_protect) def dispatch(self, request, *args, **kwargs): return super().dispatch(request,*args,**kwargs) def get(self,request): return HttpResponse('hahaha') @method_decorator(csrf_protect) def post(self,request): return HttpResponse('post')