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('登陆成功')
后台

 

posted @ 2019-01-23 15:12  ChuckXue  阅读(122)  评论(0编辑  收藏  举报