目录html
(1) Django默认自带7个中间件,中间件相似于django的门卫,数据在进入和离开时都须要通过中间件 (2) 那么中间件能干什么? 控制用户访问频率,全局登陆校验,用户访问白名单,黑名单等 (3) settings.py里面的中间件配置信息: MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] (4) 中间件的执行规则: 1> 数据传到后端时:按照(3)中的顺序,从上到下,依次通过这些中间件处理 2> 当后端处理完以后,按照从下往上的执行顺序,通过这些中间件的处理以后传到前端 3> 还有一些规则,会在下面的代码中讲 (5) 中间件中主要有几个方法: process_request(self,request) process_view(self, request, callback, callback_args, callback_kwargs) process_template_response(self,request,response) process_exception(self, request, exception) process_response(self, request, response)
(1) 先导包(单独的py文件) from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse (2) 自定义中间件 class Md1(MiddlewareMixin): def process_request(self,request): print("Md1请求") def process_response(self,request,response): print("Md1返回") return response class Md2(MiddlewareMixin): def process_request(self,request): print("Md2请求") #return HttpResponse("Md2中断") def process_response(self,request,response): print("Md2返回") return response (3) 在view中定义一个视图函数 def index(request): print("view函数...") return HttpResponse("OK") (4) 在settings.py中的MIDDLEWARE里注册自定义中间件 ps:执行结果 Md1请求 Md2请求 view函数... Md2返回 Md1返回 ps2:若是当请求到达请求2的时候直接不符合条件返回,即return HttpResponse("Md2中断"),程序将把请求直接发给中间件2返回,而后依次返回到请求者,结果以下: 返回Md2中断的页面,后台打印以下: Md1请求 Md2请求 Md2返回 Md1返回
总结: (1) 中间件的process_request方法是在执行视图函数以前执行的。 (2) 当配置多个中间件时,会按照MIDDLEWARE中的注册顺序,也就是列表的索引值,从前到后依次执行的。 (3) 不一样中间件之间传递的request都是同一个对象。 多个中间件中的process_response方法是按照MIDDLEWARE中的注册顺序倒序执行的, ---> 第一个中间件的process_request方法首先执行,而它的process_response方法最后执行, 最后一个中间件的process_request方法最后一个执行,它的process_response方法是最早执行。
钓鱼网站:银行转帐的路径,能够拿到,而后你作一个跟银行如出一辙的页面,也朝银行的接口提交数据,当用户在钓鱼网站输入对方帐户名和转帐金额以后,点击发送。其实内部是将对方帐户换成了钓鱼网站的造假人员的帐户,形成你转帐转错帐户的状况。
(1) 在form表单中应用 <form action="" method="post"> {% csrf_token %} <p>用户名:<input type="text" name="name"></p> <p>密码:<input type="text" name="password"></p> <p><input type="submit"></p> </form> (2) Ajax中应用 <body> <form action="" method="post"> {% csrf_token %} <p>用户名:<input type="text" name="name"></p> <p>密码:<input type="text" name="password" id="pwd"></p> <p><input type="submit"></p> </form> <button class="btn">点我</button> </body> <script> $(".btn").click(function () { $.ajax({ url: '', type: 'post', data: { 'name': $('[name="name"]').val(), 'password': $("#pwd").val(), 'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val() }, success: function (data) { console.log(data) } }) }) </script> </html>
# 只想给某个视图函数加上csrf校验 from django.views.decorators.csrf import csrf_exempt,csrf_protect # 局部禁用 @csrf_exempt def index(request): pass # 局部使用 @csrf_protect def login(request): pass # CBV比较特殊,不能单独加在某个方法上 # 只能加在类上或dispatch方法上 from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt,csrf_protect @method_decorator(csrf_exempt,name='dispatch') # 第一种 class Csrf_Token(View): @method_decorator(csrf_exempt) # 第二种 def dispatch(self,request,*args,**kwargs): res = super().dispatch(request,*args,**kwargs) return res @method_decorator(csrf_exempt) # 这里这么写不行!!! def get(self,request): pass def post(self,request): pass