doraemon的python csrf校验(国庆大更新)

### 11.11 csrf装饰器

```python
from django.views.decorators.csrf import csrf_exempt,csrf_protect,ensure_csrf_cookie

csrf_exempt   #某个视图不需要进行csrf校验
csrf_protect   #某个视图需要进行csrf校验
ensure_csrf_cookie #确保生成csrf的cookie

```

csrf功能:

1.csrf中间件中执行process_request:

​    1. 从cookie中获取到csrftoken的值

​    2. csrftoken的值放入到 request.META

2.执行process_view

1. 查询视图函数是否使用csrf_exempt装饰器,使用了就不进行csrf的校验

2. 判断请求方式:

   1. 如果是GET', 'HEAD', 'OPTIONS', 'TRACE'

      不进行csrf校验

      2. 其他的请求方式(post,put)

      进行csrf校验:

      1.获取cookie中csrftoken的值

      获取csrfmiddlewaretoken的值

      ​    能获取到  ——》 request_csrf_token

      ​    获取不到   ——》 获取请求头中X-csrftoken的值 ——》request_csrf_token

      比较上述request_csrf_token和cookie中csrftoken的值,比较成功接收请求,比较不成功拒绝请求。

#### 11.11.1 ajax

详情地址:https://www.cnblogs.com/maple-shaw/articles/9524153.html

json的基础 

json

一种数据交换的格式

python

支持的数据类型:字符串、数字、列表、字典、布尔值、None

转化:序列化   josn.dumps(python的数据)      josn.dump(python的数据,f)    

​          反序列化   josn.loads(json的字符串)      josn.load(json的字符串,f)

js

支持的数据类型:字符串、数字、数组、对象、布尔值、null

转化:

序列化:JSON.stringfy(js的数据类型)

反序列化:JSON.parse(json的字符串)

![img](https://images2018.cnblogs.com/blog/867021/201804/867021-20180407213606833-782897022.jpg)

ajax的定义:
    AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。

特点:

1. 异步
2. 局部刷新
3. 传输的数据量少

ajax的标准格式

$.ajax({

​    url:发送的地址,

​    type:请求方式,

​    processData:false;  //不处理编码方式

​    contentType:false;    //不处理请求头

​    data:formobj,

​    success:function(res){

​    响应体

}

})

jquery发ajax请求

```html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="x-ua-compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>AJAX局部刷新实例</title>
</head>
<body>

<input type="text" id="i1">+
<input type="text" id="i2">=
<input type="text" id="i3">
<input type="button" value="AJAX提交" id="b1">

<script src="/static/jquery-3.2.1.min.js"></script>
<script>
  $("#b1").on("click", function () {
    $.ajax({
      url:"/ajax_add/",
      type:"GET",
      data:{"i1":$("#i1").val(),"i2":$("#i2").val()},
      success:function (data) {
        $("#i3").val(data);
      }
    })
  })
</script>
</body>
</html>

HTML部分代码
```

上传文件:

```html
<input type="file" id="f1">
<button id="b1">上传</button>


$('#b1').click(function () {
        var  formobj =  new FormData();

        formobj.append('file',document.getElementById('f1').files[0]);  /*前端里元素的获取*/
        // formobj.append('file',$('#f1')[0].files[0]);
        formobj.append('name','alex');

        $.ajax({
            url: '/upload/',
            type: 'post',
            data:formobj ,
            processData:false,  // 
            contentType:false,
            success: function (res) {
                $("[name='i3']").val(res)
            },
        })
    })
```

ajax通过csrf的校验

前提条件:确保有csrftoken的cookie

在页面中使用{% csrf_token %}

加装饰器 ensure_csrf_cookie

from django.views.decorators.csrf import csrf_exempt,csrf_protect,  ensure_csrf_cookie

1.给data中添加csrfmiddlewaretoken的值

```html
data: {
    'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val(),
    a: $("[name='i1']").val(),
    b: $("[name='i2']").val(),
},
```

2.加请求头

```html
headers:{
    'x-csrftoken':$('[name="csrfmiddlewaretoken"]').val(),
},
```

### 

 

posted @ 2019-10-08 23:15  番茄炒蛋548542  阅读(156)  评论(0编辑  收藏  举报