zoukankan      html  css  js  c++  java
  • Django进阶(CSRF、Ajax)

    1、跨站请求伪造:CSRF

    django为用户实现:防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。
    全局:
      中间件 django.middleware.csrf.CsrfViewMiddleware
    局部:
        @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
        @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件

    注:from django.views.decorators.csrf import csrf_exempt,csrf_protect

    html中设置Token:
      {% csrf_token %}

    view视图返回方法:

    from django.template.context import RequestContext
    
    return render_to_response('Account/Login.html',data,context_instance=RequestContext(request) 
    或者
    return render(request, 'xxx.html', data)
    #render()方法是render_to_response的一个崭新的快捷方式,render()方法会自动使用RequestContext=RequestContext(request)
    

    2、Ajax

    AJAX = 异步JavaScript 和 XML(Asynchronous JavaScript and XML)
    简短地说,在不重载整个网页的情况下,AJAX 通过后台加载数据,并在网页上进行显示。

     示例:

    view.py

    from django.views.decorators.csrf import csrf_protect
    import json
    
    @csrf_protect
    def ajax_data(request):
        if request.method == 'POST':
            ret = {'status':True,'msg':"",'data':[11,22,33,44]}
            try:
                print request.POST
            except Exception,e:
                ret['status'] = False
                ret['msg'] = str(e)
            return HttpResponse(json.dumps(ret))  #默认只能发送字符串,用json把字典转换成字符穿
        else:
            return render(request, 'ajax_app/aaa.html')
            #render()方法是render_to_response的一个崭新的快捷方式,前者会自动使用RequestContext=RequestContext(request)
    

     aaa.html

        {% csrf_token %}
        <input id="ajax_id" type="text"/>
        <input type="button" value="点击执行ajax请求" onclick="myajax();"/>  {#点击时就调用myajax()函数 #}
    
        <script src="/static/jquery-3.3.1.min.js"></script>  {# #配置js文件位置 #}
        <script src="/static/jquery.cookie.js"></script>
        <script type="text/javascript">
            var csrftokens = $.cookie('csrftoken'); //获取当前csrftoken值
            function csrfSafeMethod(method) {
                // 根据请求方法判断加不加 CSRF protection
                return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
            }
            $.ajaxSetup({
                // 发送ajax之前,执行以下这个函数
                beforeSend: function(xhr, settings) { // xhr=XmlHttpRequest 对象,所有ajax请求底层操作都是使用的它来做的
                    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                        xhr.setRequestHeader("X-CSRFToken", csrftokens);
                    }
                }
            });
    
            function myajax(){  // 创建点击事件函数
                var temp = $('#ajax_id').val(); //获取input标签id=ajax_id的值,用户输入
                var user_list = [
                {'username':'yangmv','age':18},
                {'username':'wj','age':28}];
    
                $.ajax({
                    url:'/ajax_app/test',
                    type:'POST',
                    tradition:true,  {#对数据原生处理,不做加工#}
                    data:{data0:temp,data1:JSON.stringify(user_list)}, {#类似以json.dumps转换为字符串的方式#}
                    success:function (arg) {   //arg为返回的数据
                        var obj = jQuery.parseJSON(arg); {#把返回的字符串数据用json.load成字典#}
                        if(obj.status){   //status字段为view中定义好的字段,为True
                            alert('okkkkk');
                        }else{
                            alert('obj.msg');
                    }
                    }
                });
    
            }
        </script>
    

     在setting.py文件中设置static文件夹路径:

    STATIC_URL = '/static/'
    STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)
    

    CSRF  with Ajax

    {{ csrf_token }}  # 在html这样写,前端就会显示它
    {% csrf_token %}  # 在html这样写,不会显示,但是会生成一个隐藏的input框,type=hidden
    

     如果不是按照如上面使用jquery.cookie.js那样的方法,没有使用csrfSafeMethod、$.ajaxSetup;那就要在data中加入:csrfmiddlewaretoken:'{{ csrf_token }}'

    function myajax(){
    	var temp = $('#ajax_id').val();
    	$.ajax({
    		url:'/ajax_app/test',
    		type:'POST',
    		data:{data1:temp,csrfmiddlewaretoken:'{{ csrf_token  }}'},
    		success:function (arg) {
    			var obj = jQuery.parseJSON(arg);
    			$('#ajax_id').val(obj.msg);
    		},
    		error:function () {
    			alert("failed");
    		}
    	});
    
    }
    

     否则ajax的post请求会报错,forbidden
    Forbidden (CSRF token missing or incorrect.): /ajax_app/test

  • 相关阅读:
    最长公共子序列和最长公共连续子序列 andrew的日志 网易博客
    Best Computer Science Interview Books JiansNet
    分享:Mitmproxy 0.9 发布,支持 SSL 的 HTTP 代理
    创业环境差,被迫“走西口”:一位台湾码农的心路历程
    STLSupport GDB Wiki
    utils C/C++的常用工具类
    题目36 ACM在线评测系统
    DRAMA QUEEN_洪晃在ilook的BLOG
    Codeblocks调试STL——gdb with python support Wanglikai91 博客园
    python urlencode 编码
  • 原文地址:https://www.cnblogs.com/honey-badger/p/8908467.html
Copyright © 2011-2022 走看看