• 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('登陆成功')
    后台
  • 相关阅读:
    windbg常用命令
    Windbg双机调试环境配置(Windows7/Windows XP+VirtualBox/VMware+WDK7600)
    SVN使用说明文档
    JavaScript-浏览器兼容之客户端检测
    JavaScript-执行环境
    JavaScript-函数
    JavaScript-静态私有变量
    JavaScript-构造函数模式
    JavaScript 自执行函数剖析
    easyui如何在datagrid 每行增加超链接
  • 原文地址:https://www.cnblogs.com/xuechengeng/p/10309108.html
Copyright © 2020-2023  润新知