Django之组件--中间件
中间件
中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能
自定义中间件:
1 写一个类,继承MiddlewareMixin, 2 在类中写方法: process_request 3 在settings中配置
from django.utils.deprecation import MiddlewareMixin class CORSMiddle(MiddlewareMixin): def process_response(self,request,response): # 从什么地址跨 response['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8001' # 非简单请求, if request.method == 'OPTIONS': # 如果是put和delete方法,重新再发一次请求 response['Access-Control-Allow-Methods'] = 'PUT,DELETE' response['Access-Control-Allow-Headers']='Content-Type' return response mid.py
自定义中间件的5个方法:
process_request(self,request)
-执行顺序,settings中中间件自上而下执行 -请求来的时候会执行它 -request对象,就是本次请求的request对象,对它处理后,视图函数拿到的就是处理后的request对象
-可以拿到所有request请求内容!
process_view(self, request, callback, callback_args, callback_kwargs)
-callback是视图函数,callback_args, callback_kwargs是视图函数的参数
-可以调用callback方法
process_template_response(self,request,response)(忘掉)
-只有视图函数返回的对象中有render方法的时候,才会执行
process_exception(self, request, exception)
-视图函数出错,会执行它
process_response(self, request, response)
-执行顺序,settings中中间件自下而上执行 -响应走的时候,会执行它 -request对象,就是本次请求的request对象,response是响应对象(HttpResponse的对象) -如果process_request方法返回HttpResponse的对象,请求直接返回,按中间件方法执行顺序往回走
-必须return返回
-
csrf中间件:
xss攻击/csrf跨站请求伪造
在不注释csrf中间件的情况下,在ajax提交数据的时候,必须将写在浏览器的key和value带回去,不然会被django框架禁止。
'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()
在csrf不注释的情况下用ajax完成post请求:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/jquery-3.3.1.js"></script> </head> <body> {% csrf_token %} <p>姓名:<input type="text" id="name"></p> <p>密码:<input type="password" id="pwd"></p> <p>信息:<input type="text" id="info"></p> <p> <button id="submit">提交</button> </p> </body> <script> $('#submit').click(function () { $.ajax({ url: '/test_ajax/', type: 'post', data: { name: $('#name').val(), pwd: $('#pwd').val() 'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val() }, success: function (data) { $('#info').val(data) console.log(data) } } ) }) </script> </html> 前台
def test_ajax(request): if request.method == 'GET': return render(request,'testajax.html') name = request.POST.get('name') pwd = request.POST.get('pwd') if name =='chuck' and pwd == "123": return HttpResponse('登陆成功')