目 录
-
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方法的情况下才会触发
跨站请求伪造
1、简介
跨站请求伪造(csrf) 钓鱼网站 就类似于你搭建了一个跟银行一模一样的web页面 用户在你的网站转账的时候输入用户名 密码 对方账户 银行里面的钱确实少了 但是发现收款人变了
2、原理
最简单的原理 你写的form表单中 用户的用户名 密码都会真实的提交给银行后台 但是收款人的账户却不是用户填的 你暴露给用户的是一个没有name属性的input框 你自己提前写好了一个隐藏的带有name和value的input框
3、解决策略
解决钓鱼网站的策略 只要是用户想要提交post请求的页面 我在返回给用户的时候就提前设置好一个随机字符串 当用户提交post请求的时候 我会自动先取查找是否有该随机字符串 如果有 正常提交 如果没有 直接报403
如何解决提价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')